簡體   English   中英

如何以高效的方式編寫1GB文件C#

[英]How to write 1GB file in efficient way C#

我有.txt文件(包含超過百萬行),大約1GB,我有一個字符串列表,我試圖刪除字符串列表中存在的文件中的所有行並創建新文件但它正在采取很長時間。

using (StreamReader reader = new StreamReader(_inputFileName))
{
   using (StreamWriter writer = new StreamWriter(_outputFileName))
   {
     string line;
     while ((line = reader.ReadLine()) != null)
     {
       if (!_lstLineToRemove.Contains(line))
              writer.WriteLine(line);
     }

    }
  }

如何提高代碼的性能?

通過使用PLINQ並行完成工作,您可以獲得一些加速,同時從列表切換到散列集也將大大加快Contains(檢查HashSet對於只讀操作是線程安全的。

private HashSet<string> _hshLineToRemove;

void ProcessFiles()
{
    var inputLines = File.ReadLines(_inputFileName);
    var filteredInputLines = inputLines.AsParallel().AsOrdered().Where(line => !_hshLineToRemove.Contains(line));
    File.WriteAllLines(_outputFileName, filteredInputLines);
}

如果輸出文件的順序與輸入文件的順序.AsOrdered()可以刪除.AsOrdered()並獲得一些額外的速度。

除此之外,你真的只是I / O綁定,唯一讓它更快的方法是讓更快的驅動器運行它。

代碼特別慢,因為讀寫器永遠不會並行執行。 每個人都要等待另一個。

通過使用讀者線程和編寫器線程,您幾乎可以將文件操作的速度提高一倍。 在它們之間放置一個BlockingCollection ,以便您可以在線程之間進行通信,並限制在內存中緩沖的行數。

如果計算非常昂貴(在您的情況下不是這樣),那么另一個執行處理的另一個BlockingCollection的第三個線程也可以提供幫助。

不要使用緩沖的文本例程。 使用二進制,無緩沖的庫例程,並使緩沖區大小盡可能大。 這就是如何讓它成為最快的。

你考慮過使用AWK嗎?

AWK是一個非常強大的工具來處理文本文件,您可以找到有關如何篩選符合特定條件的行的更多信息使用ASK過濾文本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM