以块的形式读取非常大的文件的最有效方法是什么?

时间:2014-01-13 19:08:15

标签: c# csv file-io

我想读取一个CSV文件,其大小可达数百GB甚至TB。 我有一个限制,我只能以32MB的块读取文件。 我对这个问题的解决方案有点慢,我想问你是否知道更好的解决方案:

const int MAX_BUFFER = 33554432; //32MB
byte[] buffer = new byte[MAX_BUFFER];
int bytesRead;

using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read))
using (BufferedStream bs = new BufferedStream(fs))
{
    string line;
    bool stop = false;
    while ((bytesRead = bs.Read(buffer, 0, MAX_BUFFER)) != 0) //reading only 32mb chunks at a time
    {
        var stream = new StreamReader(new MemoryStream(buffer));
        while ((line = stream.ReadLine()) != null)
        {
            //process line
        }

    }
}
编辑:我正在添加限制,说我无法逐行读取文件。

1 个答案:

答案 0 :(得分:2)

我建议只在文件上使用File.ReadLines。它在下面调用StreamReader.ReadLine,但它可能比为32MB块一遍又一遍地处理BufferedStream更有效。所以它就像这样简单:

foreach (var line in File.ReadLines(filePath))
{
    //process line 
}

此外,您的代码有问题,因为您可以在32MB块之间分割线,这在上面的代码中不会发生。