簡體   English   中英

如何在C#中使用線程讀取和解析非常大的平面文件?

[英]How can I read and parse very large flat file using thread in C#?

我必須讀取一個大文本文件並使用C#逐行解析它。 對於小型文件,可以使用StreamReader輕松完成,但在處理大型文件時會出現內存不足的問題。 如何使其適應大文件?

以下代碼捕獲OutOfMemoryException

using (StreamReader reader = new StreamReader(FileNameWithPath))
{
    while ((line = reader.ReadLine()) != null)
    {
        // Do something here...
    }
}

這幾乎是惰性讀取器的標准代碼,除非有一些非常大的單行,否則不應該導致OutOfMemoryException 你也可以嘗試:

foreach(var line in File.ReadLines(FileNameWithPath)) {
    // Do something here...
}

它只是使它更干凈,但做同樣的事情。 所以有兩種選擇:

  1. 一條或多條“線”簡直就是巨大的
  2. “在這里做點什么”的東西慢慢地(或快速地)吃掉你的記憶

我希望后者更有可能。

我不確定這個,但嘗試這類.net框架

MemoryMappedFile類 - 內存映射文件將文件內容映射到應用程序的邏輯地址空間。 內存映射文件使程序員能夠處理非常大的文件,因為可以同時管理內存,並且它們允許完全隨機訪問文件而無需搜索。 內存映射文件也可以跨多個進程共享。

using (var inputFile = new System.IO.StreamReader(sourceFilePath))
{
    while (inputFile.Peek() >= 0) {
        string lineData = inputFile.ReadLine();

        // Do something with lineData
    }
}

如何指定緩沖區大小?

像這樣。

using (var reader = new StreamWriter(path,false,Encoding.UTF8, 1000))
{
    .....

}

暫無
暫無

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

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