代码之家  ›  专栏  ›  技术社区  ›  Andrew Ensley

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

  •  5
  • Andrew Ensley  · 技术社区  · 15 年前

    我使用的是c(.net 2.0),我有一个相当大的文本文件(平均约1600行),需要定期检查以确保其中有一行文本。

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

    是否有某种类型的文件内容搜索api可供我使用?

    谢谢你的帮助/建议。

    7 回复  |  直到 15 年前
        1
  •  5
  •   Brian Genisio    15 年前

    好吧,你可以一直用 FileSystemWatcher 如果要在文件更改时为您提供事件,则只能按需扫描文件。

        2
  •  3
  •   Gary.Ray    15 年前

    如果文本行总是相同的,那么使用regex来匹配行中的文本可能比使用string.equals()或==在文件中循环匹配文本更有效。

    也就是说,我不知道在C语言中,在没有将文件打开到内存并读取行的情况下,如何在文件中找到文本。

    这个 link 是一个很好的教程,介绍如何使用regex来匹配使用c_的文件中的行。

        3
  •  3
  •   Will    15 年前

    除非它们是很长的线,用现代计算术语来说,1600行不是很多!文件IO将由运行时处理,并将被缓冲,速度将惊人地快,内存占用惊人地不显著。

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

    这不会是你的瓶颈。

    如果频繁轮询和/或不必要地使用正则表达式,则可能会出现瓶颈。最好使用文件系统观察程序,以避免在文件未更改的情况下对其进行分析。

        4
  •  2
  •   Martin Harris    15 年前

    这真的取决于你对“高效”的定义。

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

    如果您的意思是在尽可能短的时间内,那么这是一个将从并行架构中获得巨大好处的任务。将文件分割成块,并将每个块传递给不同的线程进行处理。当然,这不是特别的CPU效率,因为它可能会把你的所有核心在一个高水平的使用。

    如果你只想做最少的工作,你对这个文件有什么了解吗?多久更新一次?每行的前10个字符总是相同的吗?如果你上次看了100行,你需要重新扫描这些行吗?任何这些都可以节省大量的时间和内存使用。

    在一天结束的时候,虽然没有神奇的子弹,但搜索一个文件(在最坏的情况下)是一个o(n)操作。


    抱歉,重读一遍,可能会觉得很讽刺,我不是故意的。我只是想强调一下,你在一个领域取得的任何成果都有可能在其他领域失去,在这种情况下,“有效”这个词非常含糊。

        5
  •  2
  •   Markus Nigbur    15 年前
    List<String> lines = System.IO.File.ReadAllLines(file).ToList()
    lines.Contains("foo");
    
        6
  •  1
  •   Daniel Brückner    15 年前

    你应该能够像这样循环:

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

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

        7
  •  0
  •   BenAlabaster    15 年前

    我将结合使用以下两种技术:

    1)。在文件上设置文件系统监视程序。设置必要的过滤器以防止误报。你不想不必要地检查文件。

    2)。当fsw引发事件时,使用字符串file string=file.readAllLines()获取内容。

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

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

    你已经成功地避免了逐行分析文件,你 可能会将大量数据(尽管1600行文本并没有那么大)加载到内存中。当字符串文本超出范围时,垃圾回收器将回收它。