在大文本文件中查找文本数据的快速方法是啥?

Posted

技术标签:

【中文标题】在大文本文件中查找文本数据的快速方法是啥?【英文标题】:What's a fast way to lookup text data in a large text file?在大文本文件中查找文本数据的快速方法是什么? 【发布时间】:2020-10-17 06:11:00 【问题描述】:

我有一个包含不同单词和信息的词汇表。它的大小约为 100MB。但是,搜索此文件需要很长时间。有什么方法可以提高我查找数据的速度吗?例如,我正在考虑编写一个程序,将文本文件拆分为 26 个不同的文本文件(按单词的第一个字母),然后,该程序只需要检查给定单词的第一个字母,就会有要搜索的文件要小得多。这会改善程序的执行时间吗?是否有任何有效的数据结构可以存储文件?比如json。另外,数据库呢?我正在使用 Kotlin/Java。

编辑:到目前为止,我只是蛮力搜索了整个文件,直到找到匹配项。但是,正如我所说,该文件大于 100MB。该程序的执行时间大约为 5 秒,并且只搜索一个单词。将来,我希望程序能够以毫秒为单位轻松搜索 100 个单词,这是最佳的。像 Word 这样的文本编辑器在其词汇表中搜索单词。

【问题讨论】:

"这会提高程序的执行时间吗?"找出答案的一个好方法是实际编写程序并对其进行测试。 到目前为止您尝试过什么?没有银弹。这取决于您的要求。 @FedericoklezCulloca 是的,我知道,但是如果我错过了更好的解决方案,那将毫无意义。例如,也许将 word 文本文件拆分为 26*26 个不同的文本文件(按前两个字母)。我想我不是唯一一个想过这个机制的人,所以我可能只是在寻找这个机制的名称,或者寻找一个更有效的名称。 我不确定您尝试了什么,但是将整个文件加载到 RAM 中并在其中搜索一个单词应该不会花费太多时间,因此很难提出更好的解决方案如果我们不知道你做了什么,你做了什么。 另外,当然,数据库可能会有所帮助。 【参考方案1】:

也许将地图(键 = 单词,值 = 关于单词​​的信息)保存在 JSON 文件中。然后,您可以在程序中加载 JSON,提取 HashMap,并找到您想要的单词(因为哈希查找非常快)。

【讨论】:

【参考方案2】:

这取决于可用内存。如果整个 词汇表 可以放入内存而不会降低性能,那么 HashMap(如果每个单词都有关联的值)或 HashSet(如果没有)专门针对快速查找进行了优化使用权。如果无法将所有内容保存在内存中,则可以使用带有要查找的单词索引的数据库。 Apache Derby 是一个轻量级数据库,可以很好地与 Java 交互,但 HSQLDB、H2 或 SQLite 也是不错的选择。

【讨论】:

【参考方案3】:

有多种方法可以实现:

    将数据加载到关系数据库(mysql、Postgres 等)中,其中一列代表单词,其他列包含有关单词的信息。在 word 列上添加索引。这将迎合您的数据集将来增加超出分配内存的情况 将内存中的数据加载到哈希表中,key为word,value为word的信息 如果要编写自己的逻辑,可以将数据加载到列表中,按单词排序并执行二分查找

【讨论】:

【参考方案4】:

另外,数据库呢?

如果您不想在搜索中搜索所有行并且您有大表,则可以使用索引器。当您在表上创建索引时,DBMS 通常会创建 B-tree。当您需要搜索或范围搜索时,B-tree 可用于存储大量数据。检查这篇文章 link 和 MySQL link 的参考资料。如果你想了解更多关于如何实现像 B-tree 或 B+-tree 这样的结构,你可以使用这本书link。您在这里实现了用于搜索数据的结构,在这里您没有 B 树,但作者是红黑树的创建者(B 树是泛化)。 link这里也有东西。

【讨论】:

【参考方案5】:

您可以使用 ElasticSearch 或 Apache Solr 等文本搜索数据库

【讨论】:

【参考方案6】: 你有一个文件,在这个文件中,你逐字逐字搜索 假设文件中有n 字词 完整的“扫描”将占用n * time_for_one_word_check 假设time_for_one_word_check 不变,我们只关注n 使用二进制搜索(或某种形式)搜索排序的单词列表最多需要大约 log (n) 的时间 这意味着如果你有n = 10,那么全扫描需要10,二分查找需要3 对于n = 1000000,全扫描需要1000000,而二分查找需要6 所以,对数据进行排序并保存,然后搜索排序后的数据 这可以通过多种方式完成 以排序格式保存数据 您可以将数据保存到单个文件中,也可以让数据库管理保存、索引和查询这些数据 您应该选择一个数据库,如果您的数据会变得更大并且以后会增加更多复杂性,或者如果您打算能够同时查找(索引)单词及其信息 如果预计数据的数量或复杂性不会增加,您应该选择一个简单的文件 有不同的文件格式,我建议您尝试将数据保存为 json 格式,其中键是排序的单词,值是它们的描述(这允许您只搜索扔键) 在应用程序启动时将此数据加载到不可变的 Map 实现变量中 每次需要执行搜索时查询该变量

有用的研究关键词

binary search table scan and index

【讨论】:

以上是关于在大文本文件中查找文本数据的快速方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML 标记的文本内容中查找单词/文本并用突出显示标记替换匹配项的可靠方法是啥?

在大数据流中查找电子邮件地址

我们可以在大查询中上传文本文件吗?

从文本文件中读取数据并将其分配给数据框的最快方法是啥?

如何在大文本文件中拆分组合列表?

从 Perl 中的文本文件读取时跳过标题的最佳方法是啥?