Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何加快对大量文本文件(1TB)的搜索速度_Linux_Database_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Grep - Fatal编程技术网 elasticsearch,grep,Linux,Database,elasticsearch,Grep" /> elasticsearch,grep,Linux,Database,elasticsearch,Grep" />

Linux 如何加快对大量文本文件(1TB)的搜索速度

Linux 如何加快对大量文本文件(1TB)的搜索速度,linux,database,elasticsearch,grep,Linux,Database,elasticsearch,Grep,我有一个包含匿名医疗数据(年龄、国家、症状、诊断等)的文本文件集合。这些数据至少可以追溯到30年前,所以你可以想象我有一个相当大的数据集。我总共有大约20000个文本文件,总计约1TB 我需要定期搜索这些文件,查找特定字符串(不是正则表达式)的出现。搜索这些数据的最快方法是什么 我尝试过使用grep并递归搜索目录,如下所示: LC_ALL=C fgrep -r -i "searchTerm" /Folder/Containing/Files 执行上述操作的唯一问题是,搜索这些数据需要几个小时(

我有一个包含匿名医疗数据(年龄、国家、症状、诊断等)的文本文件集合。这些数据至少可以追溯到30年前,所以你可以想象我有一个相当大的数据集。我总共有大约20000个文本文件,总计约1TB

我需要定期搜索这些文件,查找特定字符串(不是正则表达式)的出现。搜索这些数据的最快方法是什么

我尝试过使用grep并递归搜索目录,如下所示:

LC_ALL=C fgrep -r -i "searchTerm" /Folder/Containing/Files
执行上述操作的唯一问题是,搜索这些数据需要几个小时(有时需要半天!)

有没有更快的方法来搜索这些数据?目前,我对不同的方法持开放态度,如数据库、elasticsearch等。如果我继续使用数据库,我将拥有大约10亿条记录

我唯一的要求是:

1) 搜索将在我的本地计算机上进行(双核CPU和8GB RAM)

2) 我将搜索字符串(不是正则表达式)


3) 我需要查看搜索字符串及其所在文件的所有事件。

我为您提供了3个选项

<>你应该考虑升级你的硬件,HDD -> SSD升级可以乘以搜索速度。p>
  • 提高现场搜索的速度。 有关各种建议,请参阅。此方法的主要思想是优化CPU负载,但您将受到HDD速度的限制。最大速度乘数是核心数

  • 您可以为数据集编制索引。 因为你在处理文本,你需要一些全文搜索数据库。Elasticsearch和Postgres是不错的选择。 此方法需要更多的磁盘空间(但通常小于x2空间,具体取决于数据结构和要索引的字段列表)。 此方法将无限快(秒)。 如果您决定使用此方法,请仔细选择analyzer配置,以匹配任务的单个单词(用于Elasticsearch)


  • 值得从两个层面讨论这个主题:方法和要使用的特定软件

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

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

    特定工具

    您描述的硬件是相对基本的。运行复杂的搜索将受益于大内存/多核硬件。有很多优秀的解决方案——弹性搜索、solr和类似的工具可以发挥神奇的作用,因为它们有强大的硬件支持

    我相信你会考虑两个选择,这取决于你的技能,以及OP提供的数据(这将有助于共享数据样本)。 *使用轻量级数据库(sqlite、postgresql)或 *使用轻量级搜索引擎

    对于第二种方法,使用descripe硬件,我建议查看“一瞥”(以及支持的agrep实用程序)。Glimple提供了一种对数据进行预索引的方法,这使得搜索速度非常快。我在大数据存储库上使用过它(很少GB,但从来没有TB)

    见:


    显然,它不像弹性搜索那样现代、功能丰富,但设置起来容易得多。它是无服务器的。OP描述的用例的主要优点是能够扫描现有文件,而无需将文档加载到额外的搜索引擎存储库。

    可能会帮助您将数据索引到elasticsearch。之后,您可以使用搜索引擎执行普通的elasticsearch查询

    如果elasticsearch具有一致的数据结构格式,您是否可以考虑将所有这些数据接收到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.
    

    要加快搜索速度,您需要一个。为了能够添加新文档而不需要重新索引所有现有文件,索引应该是增量的

    ApacheLucense是最早引入增量索引的开源项目之一。它仍然是使用最广泛的索引和搜索引擎,尽管现在扩展其功能的其他工具更受欢迎。Elasiticsearch和Solr都基于Lucense。但只要您不需要web前端,不需要支持分析查询、过滤、分组,不需要为非文本文件编制索引,也不需要为多台主机上的群集设置基础设施,Lucene仍然是最佳选择

    是一个Java库,但它附带了一个功能齐全、基于命令行的此基本演示应该已经提供了您需要的所有功能。


    有了一些Java知识,应用程序也很容易适应您的需要。您将惊讶于演示应用程序的源代码是多么简单。如果Java不应该是您选择的语言,那么它的Pyhton包装器也可能是另一种选择。演示应用程序的索引已经减少到几乎最小。默认情况下,没有使用像词干分析或复杂查询优化这样的高级功能-功能,您很可能不需要使用您的用例,但这会增加索引的大小和索引时间。

    我认为,如果您缓存最新搜索的医疗数据,它可能有助于提高性能,而不是遍历整个1TB。您可以使用redis/memcached

    已经有很多答案,我只想加上我的两分钱:

  • 拥有如此巨大的数据(1 TB)和8 GB的内存对于任何方法都是不够的,无论是使用Lucene还是Elasticsearch(内部)