2 回答

TA貢獻1794條經驗 獲得超7個贊
第一的。使用正確的工具來完成工作 -?StringBuilder
var exportString = lines
? ? .Aggregate(
? ? ? ? new StringBuilder(),?
? ? ? ? (builder, line) =>?
? ? ? ? {
? ? ? ? ? ? builder.Append(line.SCREENINGREQUESTUNIQUEID);
? ? ? ? ? ? builder.Append(";");?
? ? ? ? ? ? builder.AppendLine(line.REQUESTTIMESTAMP);
? ? ? ? ? ? return builder;
? ? ? ? })
? ? .ToString();
請注意,帶有+運算符的字符串連接將在每次+使用時實例化新的字符串實例,其中先前的字符串實例仍將保留在內存中(對于 1M 行,這將變得很重要)。您可以StringBuilder有效地完成此操作,而無需實例化新對象,并使用整個文件所需的確切內存量,而無需復制以前的值,正如托馬斯在他的回答中提到的那樣。
第二。如果您將文本寫入文件,您可以使用StreamWriter以更節省內存的方式執行此操作(但可能速度效率不高)
using (var csv = new StreamWriter("pathToFile"))
{
? ? foreach (var line in lines)
? ? {
? ? ? ? csv.Write(line.SCREENINGREQUESTUNIQUEID);
? ? ? ? csv.Write(";");?
? ? ? ? csv.WriteLine(line.REQUESTTIMESTAMP);
? ? }
}

TA貢獻1873條經驗 獲得超9個贊
您說需要導出到 CSV 文件,但實際上,您導出到 RAM 中的字符串。
像您一樣在字符串上使用+=
將創建至少 140 萬個臨時字符串,這些字符串都需要進行垃圾收集。如果每行有 100 個字符長,則內存吞吐量為
200?+?400?+?600?+?...
有 140 萬個術語。即 200 * sum(1..1.4M) 或 ~ 200 TB。以 DDR3 1333 = 10.6 GB/s 的速率計算,這將需要大約 20000 秒或 5:30 小時
使用StreamWriter寫入文件。這將為您節省大量 RAM 內存,減少內存并提高速度,因為在您仍在計算時就已經可以寫入磁盤了。
- 2 回答
- 0 關注
- 136 瀏覽
添加回答
舉報