我有.txt文件(包含超过百万行),大约1GB,我有一个字符串列表,我试图删除字符串列表中存在的文件中的所有行并创建新文件但是这需要很长时间。
using (StreamReader reader = new StreamReader(_inputFileName))
{
using (StreamWriter writer = new StreamWriter(_outputFileName))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (!_lstLineToRemove.Contains(line))
writer.WriteLine(line);
}
}
}
如何提高代码的性能?
答案 0 :(得分:4)
通过使用PLINQ并行完成工作,您可以获得一些加速,同时从列表切换到哈希集也将大大加快Contains(
检查。 HashSet
对于只读操作是线程安全的。
private HashSet<string> _hshLineToRemove;
void ProcessFiles()
{
var inputLines = File.ReadLines(_inputFileName);
var filteredInputLines = inputLines.AsParallel().AsOrdered().Where(line => !_hshLineToRemove.Contains(line));
File.WriteAllLines(_outputFileName, filteredInputLines);
}
如果输出文件的顺序与输入文件的顺序无关,则可以删除.AsOrdered()
并获得额外的速度。
除此之外,你真的只是I / O绑定,唯一让它更快的方法是让更快的驱动器运行它。
答案 1 :(得分:0)
代码特别慢,因为读写器永远不会并行执行。每个人都要等待另一个。
通过使用读者线程和编写器线程,您可以将文件操作的速度提高几倍。在它们之间放置一个BlockingCollection
,这样您就可以在线程之间进行通信,并限制在内存中缓冲的行数。
如果计算非常昂贵(在您的情况下不是这样),则另一个BlockingCollection
执行处理的第三个线程也可以提供帮助。
答案 2 :(得分:0)
不要使用缓冲的文本例程。使用二进制,无缓冲的库例程,并使缓冲区大小尽可能大。这就是如何使它成为最快的。
答案 3 :(得分:0)
您是否考虑过使用AWK
AWK是处理文本文件的一个非常强大的工具,您可以找到有关如何过滤符合特定条件的行的更多信息Filter text with ASK