.net StreamReader .Readline报内存溢出OutOfMemory,求助!!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net StreamReader .Readline报内存溢出OutOfMemory,求助!!相关的知识,希望对你有一定的参考价值。
.net StreamReader .Readline()报内存溢出OutOfMemory,求助!!内存4G,读取大文件(780M)的时候,读的过程中,提示内存溢出,32位系统是不是因为VS2010的.net framework在32位系统上最大使用内存是3G? 我监视内存发现到2.6左右就报这个,程序需要,大文件是要加载到内存之后再进行处理的,咋办呢?即使我放到服务器上,内存大,但是也会报内存溢出,谁给提供个解决方案,不胜感激!!!!
参考技术A 我也碰到这样过。我采用的是利用:FileStream 分段读取文件的大小(方法: int readLength = fs.Read(buffer, 0, lastReadBits); )。这个是分段读取数据内容。当然,你把文件的内容都保存到内存里也是不行的。最好是每段内容读完就存到数据库里,或去运算完就删除了。还要定时清理内存中的垃圾。追问
我再想想吧 不行真的得换方法了,算法是别人写的,原来只处理小数据,这次换成大数据了就不干活了。
追答呵呵,很正常,我们总是要根据需求来开发实际的应用。
本回答被提问者和网友采纳 参考技术B 用字节流读取的话不会出问题的,估计是你使用了MemoryStream 等内存函数,可以一部分一部分的读取到相应的字节数组中做缓存 参考技术C 按需读取StreamReader.Read 和 StreamReader.ReadBlock 之间的区别
【中文标题】StreamReader.Read 和 StreamReader.ReadBlock 之间的区别【英文标题】:Difference between StreamReader.Read and StreamReader.ReadBlock 【发布时间】:2010-10-10 04:27:32 【问题描述】:文档只是说 ReadBlock 是
“Read 的阻塞版本”
但这是什么意思?
以前有人问过这个问题,但是,嗯?
http://www.pcreview.co.uk/forums/thread-1385785.php
回答的人说
基本上,这意味着您可以不依赖 StreamReader.ReadBlock 返回,直到它的阅读量达到您的要求,或者 它已到达流的末尾。
我是否正确理解这是必需的,因为 Read 可能无法为您提供您所要求的一切?仅仅因为它返回 0 并不意味着你到达了文件的末尾?
所以这意味着检查返回的字节数以外的其他内容(EndOfStream?)或使用 ReadBlock 代替?
【问题讨论】:
另见c# - When to use StreamReader.ReadBlock()? - Stack Overflow。 【参考方案1】:ReadBlock 并不意味着它是线程安全的。如果您使用 Reflector 查看 StreamReader.ReadBlock(继承自 TextReader.ReadBlock)的实现,它所做的只是多次调用“Read”方法,直到“Read”方法返回 0 或我们读为请求的许多字节。这是必需的,因为“读取”方法不一定会返回您要求的那么多字节。
【讨论】:
如果 ReadBlock 只是推迟到 Read 直到 Read 返回 0,如果 Read 返回 0 但没有到达流的末尾会发生什么?或者那是不可能的?如果 Read only 返回准备好的内容,我会认为理论上可能随时返回 0?还是说错了? @J M:返回 0 总是表示到达了流的末尾,所以 Read 实际上也是阻塞的,直到它收到 something 啊——那就是最后一首了。读取块直到它至少有一些东西,并且 ReadBlock 块直到它得到你要求的所有东西或者它到达文件的末尾。无论哪种方式,0 表示文件结束。太好了,谢谢。 啊……ReadBlock 中的“block”一词是指阻塞的动作,而不是下一个“block”字节。 不要学究气,但 TextReader 用于读取字符,而不是字节。字节数可能等于也可能不等于字符数,具体取决于编码。以上是关于.net StreamReader .Readline报内存溢出OutOfMemory,求助!!的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 .net StreamReader 打开已打开的文件?
如何检测 .NET StreamReader 是不是在底层流上找到了 UTF8 BOM?