【问题标题】:C# Searching Through a Large Word ListC# 搜索大型单词列表
【发布时间】:2011-07-28 07:24:18
【问题描述】:

我有一个包含大约 170,000 字左右的文件。在 .NET 中处理此问题的最佳方法是什么?

将其加载到内存中的列表中并搜索列表是否有意义。这种大小的列表是否会成为记忆中的问题?任何有关加载和搜索此类列表的建议将不胜感激。

谢谢,

【问题讨论】:

  • 文件的格式是什么?最长的单词是什么?
  • 您要执行什么样的搜索?
  • Regular Expression怎么样?
  • 170000 个单词在内存方面并不多。最坏的情况,大约是 3 和半兆。您对容器的选择实际上应该由您打算执行的操作类型决定,但我认为内存不会有太大问题。
  • @spender:你不知道这些词是什么,所以不要做这样的假设。如果它们是我们称之为 DNA 的字母表{A, C, G, T} 上的那些小词怎么办? “小”是指每个大约 350 MB。

标签: c# .net memory


【解决方案1】:

将其加载到内存中的列表中并搜索列表是否有意义。这种大小的列表是否会成为记忆中的问题?

除非你的词很长,否则记忆在这里不会成为问题。

如果你说的是标准拉丁字母的英语,那么记忆将不是问题。

但您必须具体说明您的字长。如果你正在处理,比如说,{A, C, G, T} 上的文字,而这些文字恰好是 DNA,那么,是的,记忆将是一个问题。

任何有关加载和搜索此类列表的建议将不胜感激。

您在做什么类型的搜索?您是在寻找存在还是在寻找最接近的匹配(例如,最接近的字母匹配)?如果只是存在,请使用HashSet<string>。如果最接近的字母匹配,我将从排序的List<string> 开始并进行二进制搜索。但是如果你的话很长,我可能会考虑使用前缀树之类的东西。

最后一个问题的答案在很大程度上取决于你到底在做什么。

【讨论】:

  • 这是一个 csv 文件,我只是想找到一个单词的匹配项。
  • @user689031:字有多大?很可能简单的答案是将这些读入HashSet<string> 并测试匹配使用HashSet<string>.Contains
  • 该文件来自“Enhanced North American Benchmark Lexicon”,本质上是一本字典。 code.google.com/p/dotnetperls-controls/downloads/…
【解决方案2】:

将它们加载到List<string>,排序并使用BinarySearch

http://msdn.microsoft.com/en-us/library/w4e7fxsh.aspx

【讨论】:

    【解决方案3】:

    将整个列表加载到内存中是最占用内存的选项,但也是最快的选项。

    如果您使用文件流,您的固定内存开销几乎很低,但由于连续 IO 导致访问缓慢。

    这是您必须为您的应用程序做出的选择。

    【讨论】:

      【解决方案4】:

      Jason 建议的 Anser 是 geat。但请注意,永远不要对长字符串执行 string.split。此函数对大字符串有性能开销。和OOM的罪魁祸首。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多