【问题标题】:Matching a string in a Large text file?匹配大文本文件中的字符串?
【发布时间】:2011-02-09 14:27:05
【问题描述】:

我在一个大小为 152MB 的文本文件中有一个包含大约 700 万个项目的字符串列表。我想知道实现一个函数的最佳方法是什么,该函数接受一个字符串并返回它是否在那个字符串列表中。

【问题讨论】:

    标签: c# string text matching


    【解决方案1】:

    您是否需要多次匹配此文本文件?如果是这样,我会创建一个HashSet<string>。否则,只需逐行读取(我假设每行有一个字符串)并查看它是否匹配。

    152MB 的 ASCII 码最终会在内存中超过 300MB 的 Unicode 数据 - 但在现代机器中有足够的内存,因此将全部保存在 HashSet<string> 中确实会使重复查找非常快。

    执行此操作的绝对最简单方法可能是使用File.ReadAllLines,尽管这会创建一个随后将被丢弃的数组 - 不利于内存使用,但可能还不错:

    HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt"));
    ...
    
    if (strings.Contains(stringToCheck))
    {
        ...
    }
    

    【讨论】:

    • 其实我必须一次又一次地搜索。但我将在 Web 应用程序中使用它。内存会成为许多请求的问题吗?
    • @Taz:请求的数量无关紧要,只要您只构建一次哈希图即可 :) 根据文档:这种类型的任何公共静态成员都是线程安全的 i>,所以这里也没有问题
    • @Taz: tanascius 是对的。加载一次,您应该能够搜索(使用多个并发线程,即使 - 只要没有任何内容写入它)而无需使用任何额外的内存。只要您的网络服务器有足够的内存来保存集合,就可以了。
    • 对于 2GB 以上的大文件,您有什么建议?一次加载部分数据?
    • @Nayan:使用合适的数据库!
    【解决方案2】:

    取决于你想做什么。当您想一次又一次地重复搜索匹配项时,我会将整个文件加载到内存中(加载到 HashSet 中)。在那里很容易搜索匹配项。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 2017-07-04
      • 2019-02-28
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      相关资源
      最近更新 更多