Блокировка выходного файла для сценария оболочки, вызываемого несколько раз параллельно - PullRequest
3 голосов
/ 10 марта 2011

У меня есть около миллиона файлов, над которыми я хочу запустить скрипт оболочки и добавить результат в один файл.

Например, предположим, что я просто хочу запустить wc для файлов. Чтобы он работал быстро, я могу распараллелить его с xargs. Но я не хочу, чтобы скрипты пересекали друг друга при написании вывода. Вероятно, лучше записать несколько отдельных файлов, чем один, а затем cat их позже. Но я все же хочу, чтобы количество таких временных выходных файлов было значительно меньше, чем количество входных файлов. Есть ли способ получить вид блокировки, который я хочу, или это случай, который всегда обеспечивается по умолчанию?

Существует ли какая-либо утилита, которая будет рекурсивно cat два файла параллельно?

Я могу написать сценарий для этого, но мне придется иметь дело с временными и убирать. Так было интересно, если есть утилита, которая делает это.

1 Ответ

4 голосов
/ 10 марта 2011

GNU параллельно заявляет, что оно:

гарантирует, что выходные данные команд будут такими же, как если бы вы выполняли команды последовательно

Если это так, то я предполагаю, что было бы безопасно просто передать вывод в ваш файл и позволить parallel обрабатывать промежуточные данные.

Используйте параметр -k для поддержания порядка вывода.

Обновление: (решение не для Perl)

Другой альтернативой будет prll , которая реализована с помощью функций оболочки с некоторыми расширениями Си.Он менее многофункциональный по сравнению с GNU parallel, но должен работать для базовых сценариев использования.

Список функций утверждает:

Использует внутреннюю буферизацию и блокировку для предотвращения искажения /чередование вывода из отдельных заданий.

, поэтому оно должно отвечать вашим потребностям, если порядок вывода не важен

Однако обратите внимание на следующее утверждение на этой странице:

prll генерирует много информации о состоянии на STDERR, что затрудняет непосредственное использование вывода задания STDERR в качестве ввода для другой программы.


Отказ от ответственности: я не пробовал ни один из инструментов и просто цитирую их соответствующие документы.

...