Answers:
xargs与-P选项(进程数)。假设我想将所有日志文件压缩到4-cpu机器上的目录中:
find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2
您也可以说-n <number>每个流程的最大工作单元数。所以说我有2500个文件,然后我说:
find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2
这将启动4个bzip2进程,每个进程包含500个文件,然后当第一个进程完成时,将为最后500个文件启动另一个进程。
不知道为什么前面的答案使用xargs 和 make,您在那里有两个并行引擎!
-P选择!
xargs -P-它有一个永远不会修正的错误:parallel无论何时有2个线程恰巧在同一时刻产生输出,都会使输出(不同于)
GNU parallel也可以提供帮助。
find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}
请注意,不带-j8参数,parallel默认为计算机上的内核数:-)
无需“修复” find-利用make自身来处理并行性。
让您的进程创建一个日志文件或其他一些输出文件,然后使用如下所示的Makefile:
.SUFFIXES: .xml .out
.xml.out:
java -jar ProcessFile.jar $< 1> $@
并因此被调用:
find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8
更好的是,如果确保仅在Java进程成功完成后才创建输出文件,则可以利用make的依赖项处理来确保下次仅处理未处理的文件。