运行 fgrep 多核 mac os x

运行 fgrep 多核 mac os x

我在 8 核 Mac OS X 上运行此命令:

for i in $(cat file1);do grep "$i" file2; done > output.txt

我的 file2 有 900 万行,所以需要很多时间。是否可以使用所有核心来分割工作并更快地完成所有工作?

答案1

还有其他方法可以让事情变得更快:使用grep -f file1 file2 >output.txt.

您还可以使用 gnu 并行:http://www.gnu.org/software/parallel/parallel_tutorial.html

答案2

grep -F -f needles.txt haystack.log就是你想要的。

-F如果您不需要完整的正则表达式,则使 grep 使用简单的模式匹配。这往往会带来巨大的加速。根据您要搜索的内容,您可能不需要正则表达式,因此不妨获得更快执行更简单代码的好处。

-f是您正在寻找的模式文件。因此,您可以一次完成,而不是对 N 个模式进行完整的 N 次扫描。对于任何太大而无法放入 RAM 的文件来说,这也是一个巨大的加速。

将您正在搜索的文件放在快速磁盘上。 SSD 不一定是这里的答案,因为 grep 以非常线性的方式进行扫描,这对于普通的旋转磁盘来说就很好,当你有一个磁盘阵列时尤其快。

两个开关的组合,加上硬盘速度可以使 grep 变得非常快。如果您的数据高度重复(很好地可压缩),您可能需要尝试将其存储为 gzip 格式,并使用 zgrep 进行搜索。如果您的存储速度不是特别快,这会很有帮助。

如果您负责数据如何进入文件,请将事情变小。不要浪费太多的结构空间,并取出不携带任何信息的数据(比如 UUID 内部的 -,或者 XML 标签之间的空格和换行符),使日志更小,这会减少磁盘读取时间和解析时间时间更短。

有时进行双重解析实际上更快。这高度依赖于数据。例如,如果您正在寻找一段解析起来很复杂的数据,但它只出现在少量条目中,并且可以通过另一个易于解析的表达式轻松识别,请对简单表达式执行第一遍。这减少了运行缓慢/复杂表达式所需的数据。

如果这些没有帮助,那么split -l文件,并grep使用parallel.请记住,拆分/写入多个文件,然后让多个进程同时尝试使用同一磁盘的总时间可能会影响作业所需的总时间。如果您可以将大文件拆分为多个磁盘上的较小文件,那么是的,这样搜索可能会更快。

我见过人们犯的一个常见错误是尝试将分割文件放在 ramdisk 上。那是你在做缓存,糟糕。使用相同数量的内存来缓存您实际正在处理的内容,而不是整个文件,操作系统很可能会做得更好。

此外,您还希望在处理不同场景时监控 CPU 和磁盘活动,并了解“瓶颈”和“饱和”之间的区别。

答案3

基于http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions

parallel -k parallel --pipepart --block 100M -a file2 -k grep {} :::: file1

更简单,也许更快:

parallel -j0 -k grep {} file2 :::: file1

相关内容