![在数百万个文件中以更有效的方式查找文件内容](https://linux22.com/image/920384/%E5%9C%A8%E6%95%B0%E7%99%BE%E4%B8%87%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BB%A5%E6%9B%B4%E6%9C%89%E6%95%88%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9.png)
我们目前有一系列按日期、类型排序的文件,以及包含详细信息的单独 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
。