我有几个大文件,我需要传送到本地机器和进程。传输所需的时间与文件的处理时间一样长,并且我希望在它传输之后立即开始处理它。但是处理过程可能比传输时间更长,我不希望进程不断积累,但我想将其限制在一些数字上,比如4。
请考虑以下几点:
LIST_OF_LARGE_FILES="file1 file2 file3 file4 ... fileN"
for FILE in $LIST_OF_LARGE_FILES; do
scp user@host:$FILE ./
myCommand $FILE &
done这将传输每个文件,并在传输之后开始处理它,同时允许下一个文件开始传输。但是,如果myCommand $FILE传输一个文件所需的时间要长得多,这些文件就会不断堆积,使本地机器陷入泥潭。所以我想把myCommand限制在2-4个并行实例上。随后调用myCommand的尝试应该对其进行缓冲,直到打开“时隙”为止。在BASH中是否有一个很好的方法来做到这一点(使用xargs或其他实用程序是可以接受的)。
更新:感谢您在这方面提供的帮助。现在,我正在尝试实现以下逻辑:
LIST_OF_LARGE_FILES="file1 file2 file3 file4 ... fileN"
for FILE in $LIST_OF_LARGE_FILES; do
echo "Starting on $FILE" # should go to terminal output
scp user@host:$FILE ./
echo "Processing $FILE" # should go to terminal output
echo $FILE # should go through pipe to parallel
done | parallel myCommand发布于 2018-07-17 20:51:27
为此,您可以使用GNU并行。只需回显您想要运行到parallel中的命令,它将在您的计算机的每个CPU核心上运行一个作业。
for f in ... ; do
scp ...
echo ./process "$f"
done | parallel如果您一次需要4个进程,请使用parallel -j 4。
如果您想要进度条,请使用parallel --bar。
或者,仅用null终止回显文件名,并将处理命令添加到parallel调用中。
for f in ... ; do
scp ...
printf "%s\0" "$f"
done | parallel -0 -j4 ./process https://stackoverflow.com/questions/51388976
复制相似问题