[问题] 请问文字档太大OutOfMemoryException

楼主: takesi5200 (小咪)   2017-12-19 08:34:46
不好意思,我所处理的IO文字档是未格式化的
文字档最少有1GB多,差不多有2千多万行
我用ReadAllLines方式存在string变量里
但执行确出现"OutOfMemoryException"
不知道有没有高手可以帮忙~"~ 感谢万分
DirectoryInfo di = new DirectoryInfo(System.Environment.CurrentDirectory + @"\
tm
List<String> _sub = new List<string>(); //宣告动态阵列
foreach (var fi in di.GetFiles("*", SearchOption.AllDirectories))
{ //tmp资料夹里的文字档都做处理
Console.WriteLine("准备中.....");
Console.WriteLine(System.Environment.NewLine);
foreach (string s in System.IO.File.ReadAllLines(di + fi.Name))
{//将档案内容放置_sub阵列里
_sub.Add(s);
counter++;
}
}
P.S: 光一个文字档就有1GB多了;资料量非常庞大...
作者: ssccg (23)   2017-12-19 09:09:00
大档案不要一次全读进内存啊用Stream一次处理一部分就好
作者: testPtt (测试)   2017-12-19 09:13:00
StreamReader 有试过吗
作者: Laluth (阳光)   2017-12-19 13:04:00
应该是卡到执行档使用内存的上限 程式改成64bit看看
作者: Litfal (Litfal)   2017-12-19 13:59:00
不是阿,你读完放到阵列里面,不就等于放在内存里你文字档格式是什么?UTF-8或ANSI读出来成String变Unicode,单字节字多的话,读出来需要的内存就翻倍了。1GB档读完爆2GB内存很正常你可以试试用.nf 4.5以上的64bit,或是改写你每一行处理的逻辑
作者: capercat (Qoo)   2017-12-19 16:27:00
搜寻 gcAllowVeryLargeObject 这个试试
作者: cancelpc (阿吉)   2017-12-19 18:44:00
改一次读单列,或 stream 方式处理。刚看到 readline 也有问题!你单列处理完有释放吗?还是一直 add 那还不是都放在 memory 里

Links booklink

Contact Us: admin [ a t ] ucptt.com