大容量数据存储问题

hjy20090806 2014-10-28 09:29:16
程序需要读取多个数据文件处理,具体流程是读取一个文件,然后初始化数组处理后将结果存储到数组,再读取下一个文件进行同样。当读入文件数量大到一定程度时(任务管理器看到程序的内存占用达到1.4G),程序在初始化数组时就会报错“OutOfMemoryException”,由于处理后的数组在做整体分析时需要使用,所以在这之前不能够释放内存,请问这个有什么比较好的解决方法!
...全文
410 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
比尔咔咔 2014-10-30
  • 打赏
  • 举报
回复
楼上这些处理个文件就要上大内存方案都是怎么想的? 文件数1000? 10000呢? 1,000,000呢?
江南小鱼 2014-10-29
  • 打赏
  • 举报
回复
没有碰到过这种事情 想了一下,也没有合适的解决方案。 不过,大数据量都放到内存中,即使你提升硬件,随着数据量增大,终归要出问题的!
  • 打赏
  • 举报
回复
你这样写程序太NB了
malebird 2014-10-29
  • 打赏
  • 举报
回复
如果是服务器上,建议用64位版本的操作系统,编译目标为64位平台,内 存超过2G溢出的问题,应该就没问题了,我之前,有类似这样的问题,2千W条记录,放到Dictionary里,放1千多W ,就溢出了,没办法,只好用64位的系统
於黾 2014-10-29
  • 打赏
  • 举报
回复
即使放到数据库里,你也是分段处理,不能一下都放内存里去啊 缓存,其实也可以是内存,比如放到一个List里,或者N个变量里,或者先暂时写到文件里,需要的时候再读回来,都行
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
这个存储可不可以用数据库来解决?
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
处理结果缓存就行了,不要把整个文件都放到内存里啊 比如就是要统计所有文件里一共出现的字符数,你所有文件都放到内存里然后++,跟你分批处理,分别++,加完记住,下一个继续++,有任何区别??
内存和缓存这个不了解怎么用哦
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
引用 6 楼 dongxinxi 的回复:
统计一万个文件的数据跟统计10个文件数据的方法完全一样 那么你为什么不将这些文件分批统计,最后再合计呢?
在暂时不需要这些结果的时候处理这些会影响程序的运行速度的,现在就是在文件读取的时候默认对每个文件处理然后数据存储,速度已经比较慢了,我这电脑配置还算不错,如果放到运行速度慢点的速度会无法忍受
於黾 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 hjy20090806 的回复:
[quote=引用 1 楼 wendys1127 的回复:] 文件分割,N个部分,一部分一部分单独执行
最后的整体分析需要所有的处理结果,不能分开做哈[/quote] 处理结果缓存就行了,不要把整个文件都放到内存里啊 比如就是要统计所有文件里一共出现的字符数,你所有文件都放到内存里然后++,跟你分批处理,分别++,加完记住,下一个继续++,有任何区别??
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
引用 3 楼 LanMangFeiGe 的回复:
1.可能计算机的内存不够用了 2.用集合试试
测试了下,是计算机内存不够用,140个文件处理可以运行,141个文件处理初始化数组时就会报错“OutOfMemoryException”
  • 打赏
  • 举报
回复
需要所有的处理结果,那就将需要的数据都暂存起来(比如关联的文件名,文件长度,分析出来的有用数据...) 存一个对象跟存一个文件数据对于IO来说可差太多
  • 打赏
  • 举报
回复
统计一万个文件的数据跟统计10个文件数据的方法完全一样 那么你为什么不将这些文件分批统计,最后再合计呢?
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
引用 1 楼 wendys1127 的回复:
文件分割,N个部分,一部分一部分单独执行
最后的整体分析需要所有的处理结果,不能分开做哈
sxldfang 2014-10-29
  • 打赏
  • 举报
回复
在Net4.0中已经可以使用 内存映射文件了,搜索: MemoryMappedFile
Pigeon汪 2014-10-29
  • 打赏
  • 举报
回复
1.可能计算机的内存不够用了 2.用集合试试
attilax 2014-10-29
  • 打赏
  • 举报
回复
大上大的内存才是王道。。。当年一个性能问题解决了n久远,,结果换了ssd和大内存,立马解决。。。
tanta 2014-10-29
  • 打赏
  • 举报
回复
放到数据库中查询分析呀。或者机器升级,使用大内存。 这样做,数据量大的情况下,肯定内存不够用。
比尔咔咔 2014-10-29
  • 打赏
  • 举报
回复
最主要TPL 内存会自动释放 标准循环语句内存不会释放的.
比尔咔咔 2014-10-29
  • 打赏
  • 举报
回复
标准的 TPL Task可以解决 // 普通循环 foreach (var item in sourceCollection) { Process(item); } // 并行编程 就是以前多线程的包装 Parallel.ForEach(sourceCollection, item => Process(item));
hjy20090806 2014-10-29
  • 打赏
  • 举报
回复
引用 17 楼 rtdb 的回复:
32位系统用户可用内存最多就是1.5G左右, 最简单的方案就是换64位系统,编译成64位程序,那么有多少内存就可以用多少, 来个16G你的可用内存就多了10倍。 当然修改程序逻辑才是正路。
嗯嗯,把不必要的double全部改成float,有点效果
加载更多回复(3)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧