КонтекстаЯвных родами распараллеливание с помощью xargs - Неполные результатов от xargs --max-Procs
мне нужно оптимизировать дедупликации с помощью «своего рода -u» и мой линукс машины имеет старую реализацию команды «сортировка» (т.е. 5.97), который не имеет «параллельного» варианта. Хотя «sort» реализует параллелизуемые алгоритмы (например, merge-sort), мне нужно сделать такую распараллеливание явной. Поэтому я делаю это вручную с помощью команды «xargs», которая превосходит ~ 2.5X w.r.t. к единственному методу «sort -u» ... когда он работает нормально.
Здесь интуиция того, что я делаю.
Я запускаю сценарий bash, который разбивает входной файл (например, file.txt) на несколько частей (например, file.txt.part1, file.txt.part2, file.txt.part3, file.txt.part4) , Полученные части передаются команде «xargs» для выполнения параллельной дедупликации через скрипт sortu.sh (подробности в конце). sortu.sh завершает вызов 'sort -u' и выводит результирующее имя файла (например, «sortu.sh file.txt.part1» выводит «file.txt.part1.sorted»). Затем полученные отсортированные части передаются в «sort -merge -u», который объединяет/дедуплицирует входные части, предполагая, что такие части уже отсортированы.
Проблема, с которой я столкнулась, заключается в параллелизации с помощью «xargs». Вот упрощенная версия моего кода:
AVAILABLE_CORES=4
PARTS="file.txt.part1
file.txt.part2
file.txt.part3
file.txt.part4"
SORTED_PARTS=$(echo "$PARTS" | xargs --max-args=1 \
--max-procs=$AVAILABLE_CORES \
bash sortu.sh \
)
...
#More code for merging the resulting parts $SORTED_PARTS
...
Предполагаемый результат список отсортированных частей в переменной SORTED_PARTS:
echo "$SORTED_PARTS"
file.txt.part1.sorted
file.txt.part2.sorted
file.txt.part3.sorted
file.txt.part4.sorted
Симптом
Тем не менее, (иногда) есть отсутствующая отсортированная часть. Например, file.txt.part2.sorted:
echo "$SORTED_PARTS"
file.txt.part1.sorted
file.txt.part3.sorted
file.txt.part4.sorted
Этот симптом не является детерминированным в его возникновения (т.е. выполнение для того же file.txt успешно и в другое время она не) или пропавших без вести файл (т. е. это не всегда одна и та же отсортированная недостающая часть).
Проблема
У меня есть race condition, где все экземпляры sortu.sh закончить и «xargs» посылает EOF, прежде чем стандартный вывод промывается.
Вопрос
Есть ли способ, чтобы обеспечить стандартный вывод промывку до того 'xagrs' посылает EOF?
Ограничения
Я не в состоянии использовать ни parallel команды, ни "--parallel" вариант sort команды.
sortu.sh код
#!/bin/bash
SORTED=$1.sorted
sort -u $1 > $SORTED
echo $SORTED
Есть ли ошибки на stderr, если это произойдет? –
Я думаю, что вы видите условие гонки, связанное с тем, что, хотя замена команды может быть завершена, как только «xargs» завершается, сам «xargs» производит * no * output; только его дети пишут в файл, унаследованный от 'xargs'. Поскольку этот вывод буферизуется, есть шанс, что оболочка читает из этого файла, прежде чем вывод из всех дочерних элементов будет сброшен в файл. – chepner
Что такое многострочные строки для списков имен файлов вместо правильных массивов? –