簡體   English   中英

如何使用C#拆分大文本文件(32 GB)

[英]How to split the large text file(32 GB) using C#

我嘗試使用下面的代碼將文件拆分為32GB,但我得到了memory exception

請建議我使用C#拆分文件。

string[] splitFile = File.ReadAllLines(@"E:\\JKS\\ImportGenius\\0.txt");

int cycle = 1;
int splitSize = Convert.ToInt32(txtNoOfLines.Text);
var chunk = splitFile.Take(splitSize);
var rem = splitFile.Skip(splitSize);

while (chunk.Take(1).Count() > 0)
{
    string filename = "file" + cycle.ToString() + ".txt";
    using (StreamWriter sw = new StreamWriter(filename))
    {
        foreach (string line in chunk)
        {
    sw.WriteLine(line);
        }
    }
    chunk = rem.Take(splitSize);
    rem = rem.Skip(splitSize);
    cycle++;
}

好吧,首先,您需要使用File.ReadLines (假設您使用的是.NET 4),以便它不會嘗試將整個內容讀入內存。 然后我只是繼續調用一個方法來向新文件吐出“下一行”但很多行:

int splitSize = Convert.ToInt32(txtNoOfLines.Text);
using (var lineIterator = File.ReadLines(...).GetEnumerator())
{
    bool stillGoing = true;
    for (int chunk = 0; stillGoing; chunk++)
    {
        stillGoing = WriteChunk(lineIterator, splitSize, chunk);
    }
}

...

private static bool WriteChunk(IEnumerator<string> lineIterator,
                               int splitSize, int chunk)
{
    using (var writer = File.CreateText("file " + chunk + ".txt"))
    {
        for (int i = 0; i < splitSize; i++)
        {
            if (!lineIterator.MoveNext())
            {
                return false;
            }
            writer.WriteLine(lineIterator.Current);
        }
    }
    return true;
}

不要立即將所有行讀入數組,而是使用StremReader.ReadLine方法,如:

using (StreamReader sr = new StreamReader(@"E:\\JKS\\ImportGenius\\0.txt")) 
{
    while (sr.Peek() >= 0) 
    {
       var fileLine = sr.ReadLine();
       //do something with line
    }
}

而不是使用File.ReadAllLines一次讀取所有文件,而是在foreach循環中使用File.ReadLines來根據需要讀取行。

foreach (var line in File.ReadLines(@"E:\\JKS\\ImportGenius\\0.txt"))
{
    // Do something
}

編輯:在不相關的注釋中,在為字符串添加“@”前綴時,不必轉義反斜杠。 所以寫"E:\\\\JKS\\\\ImportGenius\\\\0.txt"@"E:\\JKS\\ImportGenius\\0.txt" ,但@"E:\\\\JKS\\\\ImportGenius\\\\0.txt"是多余的。

 File.ReadAllLines 

這將把整個文件入內存

要處理大型文件,您只需要在內存中讀取您需要的內容,然后在完成后立即將其丟棄。

一個更好的選擇是File.ReadLines ,它返回一個惰性枚舉器,當你從枚舉器得到下一行時,數據只被讀入內存。 如果您避免多次枚舉(例如,不使用Count() ),則只會讀取文件的某些部分。

這里的問題是你使用File.ReadAllLines()一次將整個文件的內容讀入內存。 您需要做的是使用File.OpenRead()打開FileStream並讀取/寫入較小的塊。

編輯:實際上對於你的情況ReadLine顯然更好。 看到其他答案。 :)

使用StreamReade r讀取文件,使用StreamWriter寫入。

暫無
暫無

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

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