作者takesi5200 (小咪)
看板C_Sharp
标题[问题] 请问文字档太大OutOfMemoryException
时间Tue Dec 19 08:34:46 2017
不好意思,我所处理的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多了;资料量非常庞大...
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.231.50.253
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1513643689.A.CCD.html
1F:→ ssccg: 大档案不要一次全读进记忆体啊12/19 09:09
2F:→ ssccg: 用Stream一次处理一部分就好12/19 09:10
3F:→ testPtt: StreamReader 有试过吗12/19 09:13
不好意思,我用StreamReader也一样
StreamReader sr =....
while(sr.ReadLine()!=null)
{
}
在六百多万行就出现outofmemory
※ 编辑: takesi5200 (42.76.110.203), 12/19/2017 10:51:56
4F:→ Laluth: 应该是卡到执行档使用记忆体的上限 程式改成64bit看看 12/19 13:04
5F:→ Litfal: 不是阿,你读完放到阵列里面,不就等於放在记忆体里 12/19 13:59
6F:→ Litfal: 你文字档格式是什麽? 12/19 13:59
7F:→ Litfal: UTF-8或ANSI读出来成String变Unicode,单位元组字多的话, 12/19 14:02
8F:→ Litfal: 读出来需要的记忆体就翻倍了。1GB档读完爆2GB记忆体很正常 12/19 14:03
9F:→ Litfal: 你可以试试用.nf 4.5以上的64bit,或是改写你每一行处理的 12/19 14:05
10F:→ Litfal: 逻辑 12/19 14:05
11F:推 capercat: 搜寻 gcAllowVeryLargeObject 这个试试 12/19 16:27
12F:推 cancelpc: 改一次读单列,或 stream 方式处理。 12/19 18:44
13F:→ cancelpc: 刚看到 readline 也有问题! 12/19 18:45
14F:推 cancelpc: 你单列处理完有释放吗?还是一直 add 那还不是都放在 me 12/19 18:49
15F:→ cancelpc: mory 里 12/19 18:49
感谢各位前辈的指点,Initialize()释放後己经解决此问题
List<String> _sub = new List<string>();
string[] readtext = System.IO.File.ReadAllLines(failpath);
foreach (string s in readtext)
{//将档案内容放置_sub阵列里
_sub.Add(s);
counter++;
readtext.Initialize();
}
※ 编辑: takesi5200 (125.231.50.253), 12/19/2017 21:37:21