C#从文件中读大量数据放入内存,求高效快速的方法。

问题描述

我需要将数据整体从文件中读出来,大概有一百万条,放入内存中,然后在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或者其他文字编辑工具,就非常轻松,好好想想是为什么。

时间: 2024-09-29 19:40:49

C#从文件中读大量数据放入内存,求高效快速的方法。的相关文章

“OXC0000102”的错误状态而无法将请求的数据放入内存怎么解决

  问:今天有网友在本站的专家在线问答提问,"OX76684179"指令引用的"OX047ab000"内存.因"OXC0000102"的错误状态而无法将请求的数据放入内存.电脑总是弹出这样窗口,桌面上的什么都不能点,要不就出不来,要不就是弹出这样的窗口!怎么办? 答:编辑觉得这个问题很有代表性,在这里就一并回答并解决,原因如下: 初步判断为系统文件损坏导致,可以直接使用系统自带的修复工具进行处理. 解决步骤: 开始--运行--输入"cm

C语言OJ项目参考(2972)从文件中读数据

2972: 从文件中读数据 Description 文本文件score.dic 中存储了n名学生的信息(班级编号,姓名,成绩),每个学生信息占一行,每行的数据之间使用制表符分割,如下所示: 145811 fuxin 100 145811 chengxian 90 145812 zhangxue 92 145812 lijun 88 -- 文件中存储的学生信息按照班级编号升序排列,每个班级的人数可以不同,要求读取文件中所有学生的成绩,计算每个班级的平均成绩,将班级编号和平均成绩输出. 主程序已给出

c++ 编程问题-.txt文件中删除某些数据而保留其他数据

问题描述 .txt文件中删除某些数据而保留其他数据 比如我有个.txt文件,名字叫aaa 里面有数据是这样的: 第一行11111 第二行23222 第三行32562 那么怎么才能用C++的代码实现把第二行删除掉,而保留第一行和第三行呢? 求代码,最后带一些解析 解决方案 先用ostream对象把文件读到一个缓冲区,然后对缓冲区修改,最后将缓冲区用istream对象写入到文件就行了,主要是对缓冲区的操作而已

c#-怎么把xml的数据放入listbox中

问题描述 怎么把xml的数据放入listbox中 请问,怎么把xml的数据放入到listbox中显示出来name的部分,其他的地方另外保存,然后点击button,listbox选中的数据进入另一个listbox中,并且生成新的xml文件,谢谢 解决方案 解析xml文件,找到name标签展示即可

Java从zip文件中解析XML数据实例

从zip文件中解析xml文件一般步骤是先解压zip文件,然后在解析xml,这里直接从zip文件中读取xml的输入流进行解析,减少I/O操作.下面是一个从zip文件中解析xml文件的示例:    代码如下 复制代码 /**  * 从zip文件中解析XML数据<br/>  * @param filePath 文件绝对路径  * @return List<?>  * @throws IOException  * @throws DocumentException  * @author 大

如何将网页数据放入Excel中

  如何将网页数据放入Excel中,并实时更新?数据>自网站>输入网址>导出>属性>根据需求调整设置,完成!

遍历-如何读取一个大文件夹中全部xml文件。将其路径放入哪种容器

问题描述 如何读取一个大文件夹中全部xml文件.将其路径放入哪种容器 现在在一个大的文件夹中,包含了若干个子文件夹,每个文件夹可能包含N个xml,txt等其他文件.现在想通过遍历把这个大的文件夹中所有的xml文件保存到一个容器中.1.请问用什么容器比较好vector?2.最好能来个详细的例子 让鄙人学习下 解决方案 你这种方法用递归比较好,至于容器,你说的是将找到的文件的路径存放起来吧.那个就随便都可以.用List吧. public void findFileByEndStr(String di

如何将提取出来的数据放入缓存并从缓存中读取呢

问题描述 如何将提取出来的数据放入缓存并从缓存中读取呢我是个初学者各位高手帮忙指点一下

mdb-c#建好了MDB和表,我如何将DGV中的数据放入表中

问题描述 c#建好了MDB和表,我如何将DGV中的数据放入表中 希望能有大神解惑,表中我已经把列名导进去了,是利用arraylist导入列名,现在我想把DGV里的数据导入到MDB的表中,怎么做?希望能有链接或者关键的代码 解决方案 foreach (var item in dgv.Rows) { string xxx = item.cells[0].value.tostring(); string yyy = item.cells[1].value.tostring(); string zzz