问题描述
我需要将数据整体从文件中读出来,大概有一百万条,放入内存中,然后在datagridview中显示和操作。显示那里我用的虚拟模式,已经很快速了。现在主要是读取文件很花费时间,有什么高效的方法吗?目前我用的是stream
解决方案
解决方案二:
用数据库sqlite
解决方案三:
注意,是一次就取那么多数据,所以会慢。不用再说分页取之类的了
解决方案四:
百万级。秒显。
解决方案五:
什么文件,txt?
解决方案六:
不知道你是什么文件,如果是数据库,取决于数据库本身和网络,你可以使用一些内存数据库加快读取如果是文件,那么如果太大会导致卡死,体验非常不好,你用内存映射,分块读取,这样体验会好datagridview用虚拟显示应该可以了,你可以只填充看到的那几行数,滚动时再显示其他数据
解决方案七:
建议分页显示,按照显示的内容按需读取文件。
解决方案八:
读文件如果不能预读,谁也没办法。可以尝试:使用更省空间的格式,使用压缩。
解决方案九:
..那么多的数据就算txt你打开都费劲..实际上加大配置应该是可以加快速度的..不如你买一个E7-8800的CPU外加1024G的内存..
解决方案十:
可以考虑试下异步IO的方法,有篇参考文章:windows异步IO和IOCP。http://blog.csdn.net/ztz0223/article/details/7791220
解决方案十一:
100万条,每条数据算100个字节,那么就是100MB,如果装载时间有个几秒钟的延迟很正常,再长就是你程序的问题了。用热区跟踪工具调试下你程序的热区。
解决方案十二:
我觉得如果文件格式只是类似于纯文本的话,可以提高速度但是处理起来有点麻烦。如果你从数据库读取一个没有索引也没有缓存的表,实际上速度也是很慢的。其实一次读取百万条数据显示给用户看,不仅在技术上有困难,需求本身也有问题,一个人在同一时间在同一个界面上能同时浏览和处理的数据是非常有限的,所以一次性把数据都显示出来是没有意义的。所以我觉得需要从几方面解决这个问题1.不要一次读取全部数据,读一部分显示一部分2.不要一次显示全部数据,用户一次能处理多少就给他显示多少3.如果要实现读一部分的话,读取的时候控制读取Buffer的大小以及读取的Offset,然后插入到要显示的View里面
解决方案十三:
唉,如果今天的电脑速度再快100倍,内存再大1000倍,你也挡不住有疯逻辑——读大量数据放入内存——的。
解决方案十四:
对大数据量的建议还是用数据库比较好。如果文件需经常用到的话,建议将数据导入数据库先。
解决方案十五:
引用8楼diaodiaop的回复:
..那么多的数据就算txt你打开都费劲..实际上加大配置应该是可以加快速度的..不如你买一个E7-8800的CPU外加1024G的内存..
吊炸天
解决方案:
这么牛XXXX的逻辑。。膜拜死你了。哦,错了,膜拜死你老板了
解决方案:
文件多难,干嘛不数据库呢存放呢
解决方案:
为什么要一次性读取那么多数据到内存呢
解决方案:
换个SSD硬盘。机械硬盘一次给你读取那么多数据,压力太大。
解决方案:
NOSQL
解决方案:
设置web程序高速缓存大小//配置<cache>元素设置<caching>//开发人员可以调整这5种选项<!--应用程序数据缓存设定--><cachedisableExpiration="false"privateBytesLimit="1024"disableMemoryCollection="false"percentagePhysicalMemoryUsedLimit="80"privateBytesPollTime="00:01:00"/></caching>//将缓存数据循环读取并设置缓存内存KB数值大小protectedvoidPage_Load(objectsender,EventArgse){Cache["Name"]="张兆英";//加入缓存Cache["Height"]=160;Cache["Weight"]=55;IDictionaryEnumeratorCacheIDE=Cache.GetEnumerator();//显示缓存数据,inti=1;stringinfo=null;Response.Write("缓存项目数据(Key/Value):"+"<br>");while(CacheIDE.MoveNext()){info=i.ToString()+".";info+=CacheIDE.Key.ToString()+":";info+=CacheIDE.Value.ToString()+"<br>";Response.Write(info);i++;}//Cache数值使用上记得要明确类型intindex=Convert.ToInt16(Cache["Height"])-Convert.ToInt16(Cache["Weight"]);Response.Write("身高减去体重="+index+"<br><br>");//计算缓存项目的总数目Response.Write("缓存项目总数:"+Cache.Count+"<br>");//缓存内存KB数大小Response.Write("缓存可使用内存大小:"+String.Format("{0:N0}",Cache.EffectivePrivateBytesLimit)+"Bytes<BR>");}
解决方案:
为什么不用数据库???
解决方案:
可以一点一点异步显示的
解决方案:
可以只读取数据条目放入内存中,在根据滚动条的位置实时读取需要显示的一部分数据!
解决方案:
解决方案:
为毛要读大量数据放入内存?Stream不需要全部从硬盘读出,只需要读你需要读的那一段就可以了。既然你用了虚模式,那就把虚模式研究好。理论上用户只需要看到屏幕上显示的那些数据。当你用写字板打开一个500m的Txt时,几乎是不可能完成的任务,但是换作word或者其他文字编辑工具,就非常轻松,好好想想是为什么。