在数百万个文件中以更有效的方式查找文件内容

在数百万个文件中以更有效的方式查找文件内容

我们目前有一系列按日期、类型排序的文件,以及包含详细信息的单独 XML 文件,其基本结构如下:

2020-01-01/
    FR_abc
        FR_abc_datetime_random.xml
        FR_abc_datetime_random.xml
        ...
        FR_abc_datetime_random.xml
    FR_def
        FR_def_datetime_random.xml
        FR_def_datetime_random.xml
        ...
        FR_def_datetime_random.xml
    FR_ghi
        FR_ghi_datetime_random.xml
        FR_ghi_datetime_random.xml
        ...
        FR_ghi_datetime_random.xml
    ...
    FR_xyz
        FR_xyz_datetime_random.xml
        FR_xyz_datetime_random.xml
        ...
        FR_xyz_datetime_random.xml

这个文件系统经常被修剪,但我们通常有 1.2 亿到 1.5 亿个文件。有时我们需要查询其中一个文件,有时我们知道需要查看的日期,有时不知道。如果我们知道要查看哪些日期,我们使用一个简单的命令来检查我们要查找的文本:

ls -U | xargs grep -l TEXT

其中列出了具有特定文本的文件,然后我们可以手动查询这些文件。

如果我们知道文件的类型和要查找的文本,我目前正在使用 find 命令,因此:

find . -type f -name "^FR_ghi*" | xargs grep -l TEXT

组中的其他人使用带有递归(-R)标志的 ls 命令。

使用这些命令,搜索需要很长时间,超过一天 - 我想知道是否有人知道如何加快速度,或者有任何替代命令可以提供更快的周转时间?

-- 编辑1 --

TEXT 参数可以位于文件中的任何位置,并且这些文件位于生产箱中,因此我会犹豫是否在该箱上添加另一个流程,因为这些查询是临时的,我想我的初始查询更多的是“我们是否以正确的方式做到这一点/是否有人有更好的方法”?

答案1

您可以测试类似

time head -12 <(yes "1") | xargs -n1 -P4 sleep

这将运行 12 个sleep 1命令,其中 4 个是并行的。该命令将花费 3 秒。
对于您的情况:

find . -type f -name "^FR_ghi*" | xargs -n1 -P4 grep -l TEXT

我不知道您有多少个 CPU 线程,也许 -P8 也是可行的。
当命令受 I/O 限制时,这可能没什么帮助。在这种情况下,将所有xml文件存储为 gzip 格式并使用可能会很有趣zgrep

相关内容