首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 大量文字檔處理效能優化:StringBuilder 與 StreamReader 替代方案

     編輯:程式設計綜合問答

處理數百 MB 的文字檔,若逐行 ReadLine() 並用 += 串接字串,會因字串不可變特性導致大量記憶體配置與 GC 壓力,效能極差(1 MB 耗時 7 分鐘)。核心優化點有二:使用 StringBuilder 累積輸出、改用 FileStream/BufferedStream 批次讀取 或 Parallel 處理。

效能殺手分析

  • string s = ""; s += line; 每次建立新字串物件,複製舊內容,O(N²) 時間複雜度。
  • StreamReader.ReadLine() 內部逐字元尋找換行符,對超大檔案效率低。

優化版範例(單執行緒)

using System.IO;
using System.Text;

public void ProcessLargeFile(string inputPath, string outputPath) {
    const int BufferSize = 1024 * 1024; // 1MB 緩衝
    var sb = new StringBuilder(1024 * 1024); // 預分配容量

    using (var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize))
    using (var sr = new StreamReader(fs, Encoding.UTF8, true, BufferSize))
    using (var sw = new StreamWriter(outputPath, false, Encoding.UTF8, BufferSize)) {
        string line;
        while ((line = sr.ReadLine()) != null) {
            // 解析轉換邏輯
            var parts = line.Split(',', ' ');
            if (parts.Length >= 4) {
                // 範例轉換:GOTO / 8.39900, -4.61009, 115.00000
                // → LIN {E6POS: X 8.39900, Y -8.37946, 115.00000, A 0.000, B 0.000, C 0.000, E1 0.000} C_VEL
                string x = parts[1].Trim();
                string y = parts[2].Trim();
                string z = parts[3].Trim();
                sb.Clear();
                sb.Append("LIN {E6POS: X ").Append(x)
                  .Append(", Y ").Append(y)
                  .Append(", ").Append(z)
                  .Append(", A 0.000, B 0.000, C 0.000, E1 0.000} C_VEL");
                sw.WriteLine(sb.ToString());
            }
        }
    }
}

進階:多執行緒並行處理

若轉換邏輯為 CPU 密集型(如複雜數學運算),可用 Parallel.ForEach 或 PLINQ 分塊處理,但需注意輸出順序與寫入同步(建議各執行緒寫暫存檔,最後合併)。

關鍵優化清單

  1. StringBuilder 替代字串串接,sb.Clear() 重複利用緩衝區。
  2. 增大緩衝區:FileStream/StreamReader/StreamWriter 傳入 1MB+ 緩衝,減少系統呼叫。
  3. 避免逐行 Split:若格式固定,用 Substring/IndexOf 手工解析更快。
  4. 非同步 I/O:.NET Core / .NET 5+ 可用 File.OpenRead().ReadAsync() 配合 PipeReader 高效讀取。
  5. 記憶體對應檔案 (MemoryMappedFile):極大檔(GB 級)可考慮映射為記憶體視圖隨機存取。

效能對比參考

  • 原版 (string +=, ReadLine):1 MB 約 7 分鐘。
  • 優化版:同檔案通常 < 5 秒內完成(SSD 環境)。

掌握大檔案流式處理與 StringBuilder 模式,是 C# 高效能資料處理的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved