我写了一个程序来清理我几个月来收集的一些财务数据。它总共约100GB,每天都在增长,每个文件大约1-2GB。它目前以文本文件格式存储。
以下代码用于清理数据:
static void Main()
{
string inputString;
string outputString;
// others variable omitted
string[] lineSplit;
foreach (string fullPath in Directory.GetFiles(inputDirectory))
{
using (StreamReader reader = new StreamReader(fullPath)) //read from input file
{
while ((line = reader.ReadLine()) != null)
{
//logic to clean data
...
///////////////////////////////////////////////////////////
using (StreamWriter writer = File.AppendText(outputFile))
{
writer.WriteLine(outputString);
}
}
}
}
}
它非常慢,我估计100GB的数据需要大约3-4天来完成它。我知道这是关于我的IO操作,因为我没有缓冲区等来做。我仍然是C#的新手,我找不到任何相关的例子来为IO构建适当的缓冲区。我找到的大部分示例都是用于下载,不适用于阅读文本文件。并且我无法将整个文件加载到内存中来处理它,因为它太大了。我该怎么做?任何人都可以给我一些我可以使用的代码片段吗?感谢
答案 0 :(得分:8)
您正在每一行重新打开输出文件。将循环移动到内部块,该块首先调用File.AppendText
:
using (TextReader reader = File.OpenText(fullPath))
{
using (TextWriter writer = File.AppendText(outputFile))
{
while ((line = reader.ReadLine()) != null)
{
// Logic to clean data
writer.WriteLine(outputString);
}
}
}
当然,假设每个输入文件都有一个输出文件。如果不是这种情况 - 如果每一行都可以转到一个小集合中的另一个文件 - 你可能想要保持所有输出文件打开,只需保留一个字典(或类似的东西),这样你就可以快速写入你想要的任何一个