当前位置:编程学习 > C#/ASP.NET >>

50W个对象要占用大约200M的内存,怎么能把内存降下去,求助!在线等····

解析一个文件,大概50M,约50W条数据,我要把每条数据转换成一个对象,把所有对象加到一个list里面,对象大概有七八个字段,然后针对这些字段的值进行查询计算操作,现在只要解析一次文件转换成对象就要耗掉200M的内存,求各位大神怎么解才能把内存降下去? 必须要全部信息存,不能只存主键··· C# 内存太大 --------------------编程问答-------------------- 快来XDJM们帮忙啊··· --------------------编程问答-------------------- 你要是一次性读进来,那就是这么多,考虑只处理部分数据用完释放 --------------------编程问答-------------------- 建立一个文件夹,第一次全部序列化在文件夹下,后面只更新更改的 --------------------编程问答-------------------- 要读所有对象。那么就没办法做这个优化了。
除非你读取部分对象。然后在需要的时候再读相应的部分。
类似于分页了。 --------------------编程问答-------------------- 数据量太大的,xml不适合 --------------------编程问答--------------------  200M 内存真不算大了
 这性能问题  代码上没什么可优化 无法就是分段 分量去操作数据了
 我读3W 数据都消耗500M 内存  不过内存有1T  随便折腾  自动释放 --------------------编程问答--------------------
引用 4 楼 lye2000000_super 的回复:
要读所有对象。那么就没办法做这个优化了。
除非你读取部分对象。然后在需要的时候再读相应的部分。
类似于分页了。


读部分的话我要全量查询就没法做了···· --------------------编程问答--------------------
引用 6 楼 dr592112441 的回复:
200M 内存真不算大了
 这性能问题  代码上没什么可优化 无法就是分段 分量去操作数据了
 我读3W 数据都消耗500M 内存  不过内存有1T  随便折腾  自动释放


老一点的台式机机器一般都是1G,200M的内存占了1/5呢 已经很大了···· --------------------编程问答--------------------
引用 2 楼 bdmh 的回复:
你要是一次性读进来,那就是这么多,考虑只处理部分数据用完释放


因为要全量查询,没法部分加进来·· --------------------编程问答-------------------- 查询嘛,你可以分批查,然后再合并,损失时间,节省空间 --------------------编程问答-------------------- 集合只存主键。
再按楼上的方法。

--------------------编程问答-------------------- "我要把每条数据转换成一个对象,把所有对象加到一个list里面"
这就是内存消耗的原因.
如果你咬死一定需要这样做"我要把每条数据转换成一个对象,把所有对象加到一个list里面"
那么,此问题就是无解,确实就需要这么多内存.
另外,该文件格式是什么?
"读部分的话我要全量查询就没法做了····"
全部查询,不需要全部载入,就像查询数据库中的表并不需要使用每次都Table Scan一样. --------------------编程问答-------------------- 内存映射,把磁盘映射为内存空间,象访问内存一样访问磁盘,稍有些麻烦,不过,性能还凑合。
--------------------编程问答-------------------- 要性能就换电脑吧,我用400多元就可以配到主板为G41,4核3.2GCPU,4G内存的主板套装的,淘宝上有卖,你又何必在程序上纠结呢? --------------------编程问答-------------------- 什么样的对象  --------------------编程问答-------------------- 优化  程序到一定程度,只能通过时间和空间的转换了,
可以用时间换空间--即牺牲解析时间,减少内存使用,用更长的时间做同一件事,那么使用的内存就少了。
也可以空间换时间,例如--将数据读取到内存中,以提高处理时数据读取的速度,省去了IO操作。 --------------------编程问答-------------------- 我记得 我曾经 做过  纯真IP库 的C# 解析;

——纯真IP库的数据结构  就显得 标准得多:楼主 能不能用  内存偏移量 等算法 解析 FileStream ——这样就避免了 程序 加载全局数据的 尴尬。(FileStream 不会读取 全部字节 进入内存)

——————————————————————————————————————————
另外,实在不行,大不了 就将文件  一次存入数据库,用数据库查询 就简单多了。(文件的更新频率不高,一天 10次以内的更新,是绝对可以考虑的,你只需要 每隔一个小时 将新文件 重新导入数据库一次就行)

——————————————————————————————————————————
如果你存入 内存的 数据 50M文件没有再增加的可能性——就是说,内存没有再增加的可能性的话。
你可以将 这 200M 缓存到内存中,不算什么——以后每次查询都读取内存 也是 功德一件。



--------------------编程问答--------------------
引用 6 楼 dr592112441 的回复:
200M 内存真不算大了
 这性能问题  代码上没什么可优化 无法就是分段 分量去操作数据了
 我读3W 数据都消耗500M 内存  不过内存有1T  随便折腾  自动释放

亮了,什么配置,内存容量有1TB?比不少大型服务器还牛逼啊.. --------------------编程问答-------------------- 目前服务器单条内存最大一般32G
那么主板需要提供32条内存插槽才能满1TB,
这位朋友搞it的不会连内存跟硬盘都分不清吧,
1TB内存的主机,我第一次听说.
自己接触过最大也就64GB的,8*4 32核cpu --------------------编程问答--------------------
引用 19 楼 wukaiping870123 的回复:
目前服务器单条内存最大一般32G
那么主板需要提供32条内存插槽才能满1TB,
这位朋友搞it的不会连内存跟硬盘都分不清吧,
1TB内存的主机,我第一次听说.
自己接触过最大也就64GB的,8*4 32核cpu

  呵呵  你还真oUT 了
  一会给你截张图看看  现在都搞内存服务器了 --------------------编程问答--------------------



  1T 忘记密码了! 
--------------------编程问答-------------------- 1T的内存 程序不能再优化 只能升级硬件了 --------------------编程问答-------------------- 21楼贴这个图出来,并不能说明1TB怎么样..
我反而觉得这台服务器被浪费了... ...
如果她是生产环境的服务器 
2013-02-01 14:34:49 这个时间点,21楼贴图, 
CPU利用率是0%,
内存是不到52G.
这简直就是浪费,而且是超级浪费

如果是开发测试环境,我不得不说21楼的公司钱真的很多....

虽然内存烂大街了,CPU也不贵,但是也不能这样来浪费. --------------------编程问答-------------------- 把你说的所有对象(对应一条记录)做成一个对象的一个泛型的字段,这样减少了对象的引用指针,但是其他的功能就要根据你的业务需要来增加了。不过感觉你的需求有不合理的嫌疑,把一大堆东西放在一个list里面没有意义啊,就如同不分页的浏览信息,“都看等于都不看”。 --------------------编程问答-------------------- 楼主把数据先读到数据库怎么样??? --------------------编程问答-------------------- 这个没关系的,GC会自动释放的,不用担心。 --------------------编程问答-------------------- 要不就用数据库查询,将结果转换为对象,
要不就预测查询建立内存索引。 --------------------编程问答-------------------- 1TB  内存不奇怪

Intel E7 -8800 系列处理器, 都是大家伙, 单处理器,10核20线程. 四路,就能40核80线程
在 4 socket的主板上,也就是 4路处理器, 可最大支持 2TB 内存. 单条就可以32GB --------------------编程问答-------------------- 什么叫全量查询? --------------------编程问答-------------------- --------------------编程问答-------------------- 每天回帖即可获得10分可用分! --------------------编程问答-------------------- 我是过来学习的。 --------------------编程问答-------------------- 这种事情一般在服务器上去做 --------------------编程问答-------------------- 50W个对象用LIST封装,找死么,
内存开销太大,不用封装了,自己手写查询计算操作,这样平摊下来内存会少很多 --------------------编程问答-------------------- 用时间换空间。 --------------------编程问答-------------------- 最简单的办法就是放到一个中间数据库里去 --------------------编程问答-------------------- 学习学习!! --------------------编程问答-------------------- 不使用 class 用 struct 还能少点。 --------------------编程问答-------------------- 建议转成你熟悉的数据库,然后用SQL语句查询,这样效率非常高。

当然,如果你是做考试题目,不让你用数据库,那我飘过算了。。。 --------------------编程问答-------------------- 这个好像无解啊,用数据库吧 --------------------编程问答--------------------
引用 6 楼 dr592112441 的回复:
200M 内存真不算大了
 这性能问题  代码上没什么可优化 无法就是分段 分量去操作数据了
 我读3W 数据都消耗500M 内存  不过内存有1T  随便折腾  自动释放


1T内存啊,真牛。我只有30G内存。 --------------------编程问答--------------------
引用 楼主 armstrongw 的回复:
解析一个文件,大概50M,约50W条数据,我要把每条数据转换成一个对象,把所有对象加到一个list里面,对象大概有七八个字段,然后针对这些字段的值进行查询计算操作,现在只要解析一次文件转换成对象就要耗掉200M的内存,求各位大神怎么解才能把内存降下去? 必须要全部信息存,不能只存主键···
              
为什么要放到内存了里?使用少于10K内存、仅仅处理两三行当前行数据不行吗? --------------------编程问答-------------------- 丢数据库去

数据库会压缩的 --------------------编程问答--------------------
引用 20 楼 dr592112441 的回复:
引用 19 楼 wukaiping870123 的回复:目前服务器单条内存最大一般32G
那么主板需要提供32条内存插槽才能满1TB,
这位朋友搞it的不会连内存跟硬盘都分不清吧,
1TB内存的主机,我第一次听说.
自己接触过最大也就64GB的,8*4 32核cpu
  呵呵  你还真oUT 了
  一会给你截张图看看  现在都搞内存服务器了
        ……

大开眼界了.牛逼 --------------------编程问答-------------------- 如果仅仅是要把内存降下去,可以试试定时调用Process.MaxWorkingSet --------------------编程问答-------------------- 借助中间件嘛,如存在XML中,本地aceess中



=======================================================
.NET快速开发整合框架(RDIFramework.NET),基于.NET的快速开发、整合框架,给用户和开发者最佳的.Net框架部署方案。
平台博客:[CNBLOGS]http://www.cnblogs.com/huyong 
     [CSDN]http://blog.csdn.net/chinahuyong
交流QQ:406590790 (请注明:CSDN)
平台微博:http://t.qq.com/yonghu86
邮件交流:406590790@qq.com

--------------------编程问答-------------------- 为了10分,先回张贴吧!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,