在具有多个内核的单台机器上使用 GNU 并行运行 grep 时,如何根据"large_file"文件大小、"small_file"文件大小和我正在使用的机器来设置块大小参数以获得最快的性能(或者,如果我在这里缺少其他东西,请纠正我(?设置得太高或太低时会遇到哪些性能问题/速度瓶颈?我了解块大小的作用,因为它以块的形式阻止large_file,并将这些块发送到每个作业,但我仍然错过了如何以及为什么会影响执行速度的潜力。
有问题的命令:
parallel --pipepart --block 100M --jobs 10 -a large_file.csv grep -f small_file.csv
其中large_file.csv:
123456 1
234567 2
345667 22
和 small_file.csv在其中的地方:
1$
2$
等等...
谢谢!
parallel --pipepart --block -1 --jobs 10 -a large_file.csv grep -f small_file.csv
--block -1
会将large_file.csv拆分为每个工作槽的一个块(此处为 10 个块(。拆分将即时完成,因此不会将其读取到 RAM 中进行拆分。
如果每行花费的时间大致相同,则拆分为 n 个大小均匀的块(其中 n = 并行运行的作业数(通常是有意义的。如果它变化很大(例如,有些行的处理时间比其他行长 100 倍(,那么切成更多位可能更有意义。例如--block -10
将分成 10 倍于--block -1
的块数。
最佳值很少可以提前猜测,因为它也可能取决于您的磁盘速度。因此,请尝试不同的值并确定瓶颈所在。它通常是磁盘I/O,CPU,RAM,命令启动时间之一。