Вы можете сделать это, демультиплексировав выходные данные в разных каталогах:
stuff |
parallel --block 10M --pipe --round-robin \
'mkdir -p dir-{%}; cd dir-{%}; awk ../script.awk'
Или, если вход является файлом, вы можете использовать --pipepart
, что быстрее:
parallel --block -1 --pipepart -a bigfile \
'mkdir -p dir-{%}; cd dir-{%}; awk ../script.awk'
Тогда нет расы.Завершите слияние каталогов:
parallel 'cd {}; ls' ::: dir-* | sort -u |
parallel 'cat */{} > {}'
Если слияние недопустимо (возможно, у вас нет места на диске для 2 копий данных), вы можете использовать fifos.Но для этого вам нужно заранее знать имена всех .txt
-файлов, и вам нужна система, которая может параллельно запускать один процесс для каждого имени (10000 имен = 10000 процессов):
# Generate names-of-files.txt somehow
# Make fifos for all names in all slots
parallel 'mkdir -p {2}; mkfifo {2}/{1}' :::: \
names-of-files.txt <(seq $(parallel --number-of-threads) )
# Run the demultiplexer in the background
parallel --block -1 --pipepart -a bigfile \
'mkdir -p dir-{%}; cd dir-{%}; awk ../script.awk' &
# Start one process per name
# If you have more than 32000 names, you will need to increase the number
# of processes on your system.
cat names-of-files.txt |
parallel -j0 --pipe -N250 -I ,, parallel -j0 'parcat */{} > {}'