linux 如何加快搜索大量文本文件(1TB)

huwehgph  于 2023-10-16  发布在  Linux
关注(0)|答案(8)|浏览(132)

我有一个包含匿名医疗数据(年龄,国家,症状,诊断等)的文本文件集合。这些数据可以追溯到至少30年前,所以你可以想象我有一个相当大的数据集。我总共有大约20,000个文本文件。1TB。
我将需要定期搜索这些文件中出现的特定字符串(不是正则表达式)。搜索这些数据的最快方法是什么?
我尝试使用grep并递归搜索目录,如下所示:

LC_ALL=C fgrep -r -i "searchTerm" /Folder/Containing/Files

唯一的问题是,这需要几个小时(有时是半天!)来搜索这些数据。
有没有更快的方法来搜索这些数据?目前,我对不同的方法持开放态度,如数据库,elasticsearch等。如果我真的沿着数据库路线走下去,我将有大约。十亿条记录。
我唯一的要求是:
1)搜索将在我的本地计算机上进行(双核CPU和8GB RAM)
2)我将搜索字符串(而不是正则表达式)。
3)我需要看到的搜索字符串和它的文件内的所有事件。

mccptt67

mccptt671#

Fs Crawler可能会帮助你将数据索引到elasticsearch中。之后,正常的elasticsearch查询可以成为搜索引擎。

umuewwlo

umuewwlo2#

我认为,如果你缓存最近搜索的医疗数据,它可能会有助于性能方面,而不是通过整个1 TB,你可以使用redis/memcached

zzzyeukh

zzzyeukh3#

现在已经有很多答案了,我只想补充我的两分钱:
1.有这么多的数据(1 TB)只有8 GB的内存对于任何方法都不够好,无论是使用Lucene还是Elasticsearch(内部使用Lucene)或一些grep命令,如果你想要更快的搜索,原因很简单,所有这些系统都将数据保存在最快的内存中,以便能够更快地提供8 GB的服务(25%你应该保留的操作系统和其他25-50%至少为其他应用程序),你留下了很少GB的RAM。
1.升级SSD,增加系统上的RAM将有所帮助,但它非常麻烦,如果您遇到性能问题,则很难对系统进行垂直扩展。

建议

1.我知道你已经提到你想在你的系统上这样做,但正如我所说,它不会给给予任何真实的好处,你可能会浪费这么多时间(下文和代码方面(在各种答案中提到的许多方法)),因此建议你做我的another answer for determining the right capacity中提到的自顶向下的方法。它将帮助您快速确定您选择的任何方法的正确容量。
1.关于实现方面,我建议使用Elasticsearch(ES),因为它非常容易设置和扩展,你甚至可以使用AWS Elasticsearch,它也可以在免费层中使用,然后快速扩展,虽然我不是AWS ES的忠实粉丝,它节省了大量的设置时间,如果你非常熟悉ES,你可以快速开始。
1.为了使搜索更快,你可以将文件分割成多个字段(标题,正文,标签,作者等),只索引重要的字段,这将减少倒排索引的大小,如果你只寻找精确的字符串匹配(没有部分或全文搜索),那么你可以简单地使用keyword字段,这是更快的索引和搜索。
1.我可以继续讨论为什么Elasticsearch很好以及如何优化它,但这不是关键,底线是任何搜索都需要大量的内存,CPU和磁盘,任何一个成为瓶颈都会阻碍您的本地系统搜索和其他应用程序,因此,建议你真正考虑在外部系统上这样做,Elasticsearch确实是分布式系统的一种手段,也是最流行的今天的开源搜索系统。

nzrxty8p

nzrxty8p4#

你显然需要一个索引,几乎所有的答案都建议。你完全可以改进你的硬件,但既然你说它是固定的,我就不详细说明了。
我有几个相关的提示给你:
1.仅索引您要查找的搜索项的字段,而不是索引整个数据集;
1.创建多级索引(即索引(index over index),以便索引搜索更快。这将是特别相关的,如果您的索引增长到超过8 GB;
1.我想推荐缓存您的搜索作为一种替代方案,但这将导致一个新的搜索再次需要半天。因此,预处理数据以构建索引显然比在查询到来时处理数据更好。

小更新:

这里的很多答案都建议你把数据放在云端。我强烈建议,即使是匿名的医疗数据,你也要与来源确认(除非你从网上抓取数据)。

92dk7w1h

92dk7w1h5#

要加快搜索速度,您需要一个inverted index。为了能够添加新文档而不需要重新索引所有现有文件,索引应该是增量的。
最早引入增量索引的开源项目之一是Apache Lucene。它仍然是最广泛使用的索引和搜索引擎,尽管其他扩展其功能的工具现在更受欢迎。Elasticsearch和Solr都基于Lucene。但是,只要你不需要一个Web前端,支持分析查询,过滤,分组,支持索引非文本文件或基础设施的集群设置在多个主机,Lucene仍然是最好的选择。
Apache Lucene是一个Java库,但它附带了一个功能齐全的、基于命令行的演示应用程序。这个基本的演示应该已经提供了你需要的所有功能。
有了一些Java知识,也很容易使应用程序适应您的需求。您会惊讶于演示应用程序的源代码是多么简单。如果Java不应该是你选择的语言,它的Pyhton Package 器PyLucene也可能是一个替代品。演示应用程序的索引已经减少到几乎最低限度。默认情况下,不会使用高级功能,如复杂查询的词干提取或优化-功能,您很可能不需要您的用例,但会增加索引的大小和索引时间。

laawzig2

laawzig26#

我给你三个选择。
1.你真的应该考虑升级你的硬件,硬盘驱动器->固态硬盘升级可以成倍的搜索速度。
1.加快现场搜索速度。您可以参考this question以获得各种建议。这种方法的主要思想是优化CPU负载,但你会受到硬盘速度的限制。最大速度乘数是您的核心数量。
1.您可以索引数据集。因为您正在处理文本,所以需要一些全文搜索数据库。Elasticsearch和Postgres都是不错的选择。这种方法需要更多的磁盘空间(但通常小于x2空间,具体取决于数据结构和要索引的字段列表)。这种方法将无限快(秒)。如果您决定使用此方法,请仔细选择分析器配置,以匹配被视为任务的单个单词(对于Elasticsearch,为here is an example

tkclm6bt

tkclm6bt7#

值得从两个层面来探讨这个主题:方法和使用的特定软件。

途径:根据您描述数据的方式,似乎预索引将提供重要的帮助。预索引将对数据执行一次扫描,并将构建一个紧凑的索引,使其能够执行快速搜索并识别存储库中显示的特定术语。

根据查询的不同,索引将减少或完全消除对实际文档的搜索,即使是复杂的查询,如“查找AAA和BBB一起出现的所有文档”。

具体工具

你描述的硬件是相对基本的。运行复杂的搜索将受益于大内存/多核硬件。有很好的解决方案-ElasticSearch,solr和类似的工具可以做魔术,给予强大的硬件支持。
我相信你想看看两个选项,根据你的技能,和数据(这将有助于样本的数据可以共享)由OP. * 建立自己的索引,使用轻量级数据库(sqlite,postgresql),或者 * 使用轻量级搜索引擎。
对于第二种方法,使用describe hardware,我建议查看'slightly'(以及支持agrep实用程序)。Glimple提供了一种预索引数据的方法,这使得搜索速度非常快。我在大数据存储库上使用过它(只有几GB,但从来没有TB)。
参见:https://github.com/gvelez17/glimpse
显然,它不像Elastic Search那样现代和功能丰富,但更容易设置。它是无服务器的。OP描述的用例的主要好处是能够扫描现有文件,而不必将文档加载到额外的搜索引擎存储库中。

mmvthczy

mmvthczy8#

你能考虑把所有这些数据都输入到elasticsearch中,如果它们有一个一致的数据结构格式的话吗?

If yes, below are the quick steps:
1. Install filebeat on your local computer
2. Install elasticsearch and kibana as well.
3. Export the data by making filebeat send all the data to elasticsearch. 
4. Start searching it easily from Kibana.

相关问题