我想读取一个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
}
}
}
编辑:我正在添加限制,说我无法逐行读取文件。
答案 0 :(得分:2)
我建议只在文件上使用File.ReadLines
。它在下面调用StreamReader.ReadLine
,但它可能比为32MB块一遍又一遍地处理BufferedStream
更有效。所以它就像这样简单:
foreach (var line in File.ReadLines(filePath))
{
//process line
}
此外,您的代码有问题,因为您可以在32MB块之间分割线,这在上面的代码中不会发生。