
這是外部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);
}
uj5u.com熱心網友回復:
都告訴你了 記憶體不足~ 這么大資料量 分批處理啊 一下都搞到記憶體里,誰受得了, 處理完一部分 清空list 然后再處理下面的uj5u.com熱心網友回復:
在while回圈里可以做for里的操作,不需要再次宣告list。或者在for中移除已處理的字符集合試試。uj5u.com熱心網友回復:
你的記憶體不足已存盤這么多字符,可以要求換電腦了uj5u.com熱心網友回復:
換思路,必須換,用資料庫分頁思路,讀1000條,處理完,再讀剩下的uj5u.com熱心網友回復:
如果你硬性需求要這么讀,只能加記憶體 沒別的辦法.uj5u.com熱心網友回復:
記憶體溢位了,分成幾批處理字串吧uj5u.com熱心網友回復:
你這讀取就要500M,然后分割,產生了大量的碎片……uj5u.com熱心網友回復:
除非這個500M是一個大xml,或者一個json,你非得整體讀出來才能處理,那就只能如此否則,都是邊讀邊處理邊釋放。
也許我說的很難懂,那我來說一個大家都這么處理的東西。Tcp
假設你這500M就是一個tcp半小時內發給我的資料,按你的說法每個命令用個東西間隔(你說你splite),那么我應該先等半個小時,然后在整體splite么。很明顯不會,任何一個寫過tcp的人都不會這么做。
uj5u.com熱心網友回復:
問題原因很清楚,也有很多人說了:記憶體溢位。默認.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位作業系統上運行,物理記憶體不足就加記憶體。
uj5u.com熱心網友回復:
你放到 StringBuilder 里會好一些。如果你想都加載進來的話。uj5u.com熱心網友回復:
若果是500M需要同時參與運算(如排序),除了增加物理記憶體,還有種方式可以試一試,裝在sql資料庫里,將運算甩給sql服務器轉載請註明出處,本文鏈接:https://www.uj5u.com/net/124785.html
標籤:C#
上一篇:C#與工業自動化有什么前景嗎
下一篇:engine無法安裝
