????????在 C# 中高效讀取大文件時,需根據文件類型和場景選擇不同的技術方案,以下為綜合實踐方法及注意事項:
一、文本文件讀取方案
逐行讀取
StreamReader.ReadLine?:通過流式處理逐行加載文本,避免一次性加載整個文件到內存,適合超大文本文件(如日志文件)。
using (StreamReader sr = new StreamReader("file.txt", Encoding.UTF8, bufferSize: 1024*1024))?
{
? ? string line;
? ? while ((line = sr.ReadLine()) != null)?
? ? {
? ? ? ? // 處理每行數據
? ? }
}
File.ReadLines():返回 IEnumerable<string> 實現惰性加載,語法簡潔但需注意異常處理(如文件不存在時拋出 FileNotFoundException)。
分批次處理
結合數據庫事務分批入庫(如每 1 萬條提交一次),減少內存峰值和 I/O 壓力:
List<string> batch = new List<string>(10000);
while ((line = sr.ReadLine()) != null)?
{
? ? batch.Add(line);
? ? if (batch.Count >= 10000)?
? ? {
? ? ? ? InsertToDatabase(batch);
? ? ? ? batch.Clear();
? ? }
}
二、二進制文件讀取方案
FileStream + 字節數組
直接操作字節流,適合非文本文件(如圖像、音視頻):
using (FileStream fs = new FileStream("file.bin", FileMode.Open))?
{
? ? byte[] buffer = new byte[4096];
? ? int bytesRead;
? ? while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)?
? ? {
? ? ? ? // 處理二進制數據塊
? ? }
}
BufferedStream 加速
對底層流添加緩沖區(默認 4KB),減少直接訪問存儲設備的頻率,提升 I/O 效率。
三、優化技巧
????????緩沖區設置:通過 StreamReader 構造函數指定 bufferSize(如 1MB),平衡內存與讀取頻率。
????????編碼處理:明確指定文本編碼(如 Encoding.GetEncoding("GB2312"))避免亂碼。
????????資源釋放:使用 using 語句確保流對象及時釋放,防止內存泄漏。
四、方案對比
方法?? ??? ??? ??? ?????????????????適用場景?? ??? ??? ?????????內存占用?? ??? ?靈活性
StreamReader?? ????????????超大文本逐行處理?? ?????低?? ??? ??? ?????高(可控性強)
File.ReadLines()?? ?????????中小文本簡潔操作?? ?????中?? ??? ??? ?????中
FileStream?? ??? ??????????????二進制文件處理?? ?????????低?? ??? ??? ?????高
注意事項:對于超大規模文件(如數十 GB),需避免 File.ReadAllLines 等一次性加載方法,防止內存溢出
?
如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。?