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
的依赖项处理来确保下次仅处理未处理的文件。