所以我有 5 個文本檔案,每個檔案大小為 50GB,我想將它們全部組合成 1 個文本檔案,然后呼叫 LINQ 陳述句.Distinct(),以便新檔案中只有唯一的條目。
我現在的做法是這樣的
foreach (var file in files)
{
if (Path.GetExtension(file) == ".txt")
{
var lines = File.ReadAllLines(file);
var b = lines.Distinct();
File.AppendAllLines(clear, lines);
}
}
這里發生的問題是應用程式現在將整個文本檔案加載到記憶體中,使我的 RAM 使用率上升到 100%。如果我有 64GB 的記憶體,但我只有 16GB,這個解決方案可能會奏效。對我來說,實作我想要實作的目標的最佳選擇是什么?我應該使用 CPU 上的內核嗎?運行 5900x。
uj5u.com熱心網友回復:
如果保持順序不重要,并且如果潛在字符有限(例如 AZ),則可能會說,“好吧,讓我們從 As 開始”。
因此,您從每個檔案開始,逐行遍歷,直到找到以“A”開頭的行。如果找到,請將其添加到新檔案和 HashSet。每次找到以“A”開頭的新行時,檢查它是否在 HashSet 中,如果沒有,則將其添加到新檔案和 HashSet 中。處理完所有檔案后,處理 HashSet 并跳到下一個字母 (B)。
您將以這種方式遍歷檔案 26 次。
當然,您可以進一步優化它。檢查有多少可用記憶體并按范圍劃分可能的字符,例如,在第一次迭代中,您的 HashSet 可能包含以 AD 開頭的任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/446787.html
標籤:C# 。网 io 内存 文件.readalllines
上一篇:是否應該計算交易成本?
