确保一行存在于纯文本文件中的最有效方法

时间:2009-05-05 16:57:22

标签: c# .net file-io performance

我正在使用C#(。Net 2.0),我有一个相当大的文本文件(平均约1600行),我需要定期检查以确保有一行文字。

最有效的方法是什么?我是否真的每次都要将整个文件加载到内存中?

我可以使用某种文件内容搜索API吗?

感谢您提供任何帮助/建议。

7 个答案:

答案 0 :(得分:5)

嗯,您可以随时使用FileSystemWatcher在文件更改时为您提供事件,这样您只需按需扫描文件。

答案 1 :(得分:3)

如果文本行总是相同,则使用RegEx匹配行的文本可能比使用String.Equals()或==循环文件以匹配文本更有效。

那就是说,无论如何我在c#中都不知道在文件中找到文本而没有将文件打开到内存中并读取行。

这个link是一个很好的教程,使用RegEx来匹配文件中使用c#的行。

答案 2 :(得分:3)

除非它们很长,否则在现代计算术语中1600行并不是很多!文件IO将由运行时处理,并将被缓冲,并且速度惊人,并且内存占用空间非常小。

只需逐行阅读文件,或使用System.IO.File.ReadAllLines(),然后查看该行是否存在,例如使用整行与字符串比较。

这不会成为你的瓶颈。

如果您经常轮询和/或不必要地使用正则表达式,可能会出现瓶颈。如果文件不变,最好使用文件系统观察程序来避免解析文件。

答案 3 :(得分:2)

这实际上取决于你对“有效”的定义。

如果你的意思是内存效率那么你可以使用一个流阅读器,这样你一次只能在内存中有一行文本,不幸的是,这比一次加载整个文件要慢,并且可能会锁定文件。 / p>

如果您的意思是在最短的时间内完成,那么这项任务将从并行架构中获益匪浅。将文件拆分为块并将每个块传递给另一个要处理的线程。当然,这并不是特别节省CPU,因为它可能会使您的所有内核处于高使用水平。

如果您希望做的工作量最少,那么您对该文件有什么了解吗?它会多久更新一次?每行的前10个字符是否始终相同?如果您上次查看100行,是否需要重新扫描这些行?任何这些都可以为时间和内存使用节省大量成本。

在一天结束时虽然没有灵丹妙药,但搜索文件(在最坏的情况下)是O(n)操作。


很抱歉,只是重读一下,它可能会像讽刺一样,我不是故意的。我只是想强调,你在一个领域取得的任何好处都可能在其他地方失去,而“高效”在这样的情况下是一个非常模糊的术语。

答案 4 :(得分:2)

List<String> lines = System.IO.File.ReadAllLines(file).ToList()
lines.Contains("foo");

答案 5 :(得分:1)

你应该能够像这样循环:

String line;
while ((line = file.ReadLine()) != null)
{
    if (line matches regex blah)
        return true;
}
return false;

ReadLine方法只将文件的一行加载到内存中,而不是整个文件中。当循环再次运行时,对该行的唯一引用将丢失,因此,该行将在需要时进行垃圾回收。

答案 6 :(得分:0)

我会结合使用这里使用的几种技术:

1)。在文件上设置FileSystemWatcher。设置必要的过滤器以防止误报。你不想不必要地检查文件。

2)。当FSW引发事件时,使用字符串fileString = File.ReadAllLines()获取内容。

3)。使用简单的正则表达式来查找字符串的匹配项。

4)。如果匹配的索引大于-1,则该文件包含索引中任何值的字符串。

您已成功避免必须逐行解析文件, 可能会将大量数据(尽管1600行文本很难)加载到内存中。当字符串文字超出范围时,它将被垃圾收集器回收。

相关问题