Если у вас есть тысячи файлов для обработки, и каждый из них занимает по часу, вы можете использовать GNU Parallel , чтобы выполнить 4, 8 или 16 параллельно и сохранить занятыми все ядра ЦП, для которых вы заплатил интел так красиво ... иначе ты будешь там неделями. Кроме того, если в вашей сети несколько компьютеров, GNU Parallel может также распределять ваши задания и данные по ним, чтобы ускорить процесс.
Итак, при условии, что ваши файлы, требующие обработки, завершатся в *.OK
базовый c пример будет следующим:
parallel -k echo {#} {.} ::: ads123.OK qwe987.OK tyu456.OK
Это выведет это:
1 ads123
2 qwe987
3 tyu456
, так что, надеюсь, вы увидите, что {#}
- это только последовательно увеличение номера задания и {.}
- это имя файла с удаленным расширением.
Хорошо, теперь вы хотите немного обработать файл параметров, прежде чем начинать задание, так что вам лучше будет написать bash
функция для каждой работы, в которой вы выполняете предварительную обработку, вот так. Я вызову функцию doit()
:
doit(){
jobnum=$1
name=$2
paramfile="parameters.$jobnum"
echo Processing file: $name with parameters in file: $paramfile
}
# Make our function known to jobs started by GNU Parallel
export -f doit
# Now run the jobs
parallel -k doit {#} {.} ::: *.OK
Теперь все, что нам нужно сделать, это изменить doit()
, чтобы подготовить ваши параметры, поэтому мы можем сделать:
doit(){
jobnum=$1
name=$2
paramfile="parameters.$jobnum"
echo Processing file: $name with parameters in file: $paramfile
# Following code supplied by @poshi
echo "input_file = $name" > "$paramfile
echo "input_file2 = $name.TXT" >> "$paramfile"
echo "outfile = $name.RESULTS_OUT" >> "$paramfile"
# Add/copy/incorporate the rest of the parameters as you wish
echo program "$paramfile"
}