我写了一个程序来清理我几个月来收集的一些财务数据.它总共约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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它非常慢,我估计100GB的数据需要大约3-4天完成它.我知道这是关于我的IO操作,因为我没有缓冲区等来做.我仍然是C#的新手,我找不到任何相关的例子来为IO构建一个合适的缓冲区.我找到的大部分示例都是用于下载,不适用于阅读文本文件.而且我无法将整个文件加载到内存中来处理它,因为它太大了.我该怎么做?任何人都可以给我一些我可以使用的代码片段吗?谢谢
您将在每一行重新打开输出文件.将循环移动到块内部,该块通过调用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,假设每个输入文件有一个输出文件.如果不是这种情况 - 如果每一行都可以转到一个小集合中的另一个文件 - 你可能想要保持所有输出文件打开,只需保留一个字典(或类似的东西),这样你就可以快速写入你想要的任何一个.