C# 使用List报 OutOfMemoryException 求教!

qq_38354552 2019-08-14 05:40:21


这是外部txt文件,一共有500M.因为要对数据进行操作。所以我想把这些数据都先读到List<string>中。但是程序读到50万行时抛出OutOfMemoryException 异常。求问怎么处理。代码思路很简单,就是先读每一行,然后用Split读每个数据。在for循环剖出的异常。
List<string> listZcorn = new List<string>();
using (StreamReader sr = new StreamReader("xxx.txt", System.Text.Encoding.Default))
{
string readline = "";
while (readline.Trim() != "")
{
readline = sr.ReadLine();
listZcorn.Add(readline);
}
}
List<string> listarray = new List<string>();
for (int i = 0; i < listZcorn.Count; i++)
{
string[] ch = listZcorn[i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
listarray.AddRange(ch);
}
...全文
659 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2019-08-20
  • 打赏
  • 举报
回复
若果是500M需要同时参与运算(如排序),除了增加物理内存,还有种方式可以试一试,装在sql数据库里,将运算甩给sql服务器
XBodhi. 2019-08-20
  • 打赏
  • 举报
回复
你放到 StringBuilder 里会好一些。如果你想都加载进来的话。
不远1210 2019-08-20
  • 打赏
  • 举报
回复
问题原因很清楚,也有很多人说了:内存溢出。 默认.net程序有内存使用限制,只能使用2G内存,不管你物理内存是多大。 对于这种情况,有两种处理方法: 1、分批处理,上面都说过了,也没什么好说了,具体来说就是分批存储或分批读取,这是最优先考虑的,考虑下有没有符合要求的算法; 2、必须要处理大文件的情况下,只能这么做:修改程序配置文件:

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true"></gcAllowVeryLargeObjects>
  </runtime>
</configuration>
必须生成64位应用程序,必须在64位操作系统上运行,物理内存不足就加内存。
by_封爱 版主 2019-08-16
  • 打赏
  • 举报
回复
如果你硬性需求要这么读,只能加内存 没别的办法.
zetee 2019-08-16
  • 打赏
  • 举报
回复
换思路,必须换,用数据库分页思路,读1000条,处理完,再读剩下的
叫我 Teacher 周 2019-08-16
  • 打赏
  • 举报
回复
你的内存不足已存储这么多字符,可以要求换电脑了
wanghui0380 2019-08-16
  • 打赏
  • 举报
回复
除非这个500M是一个大xml,或者一个json,你非得整体读出来才能处理,那就只能如此 否则,都是边读边处理边释放。 也许我说的很难懂,那我来说一个大家都这么处理的东西。Tcp 假设你这500M就是一个tcp半小时内发给我的数据,按你的说法每个命令用个东西间隔(你说你splite),那么我应该先等半个小时,然后在整体splite么。很明显不会,任何一个写过tcp的人都不会这么做。
  • 打赏
  • 举报
回复
你这读取就要500M,然后分割,产生了大量的碎片……
¿?¿? 2019-08-16
  • 打赏
  • 举报
回复
内存溢出了,分成几批处理字符串吧
exception92 2019-08-15
  • 打赏
  • 举报
回复
在while循环里可以做for里的操作,不需要再次声明list。或者在for中移除已处理的字符集合试试。
冰川711 2019-08-14
  • 打赏
  • 举报
回复
都告诉你了 内存不足~ 这么大数据量 分批处理啊 一下都搞到内存里,谁受得了, 处理完一部分 清空list 然后再处理下面的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧