Параллельная GNU не делит работу равномерно

278
Zoltan

Насколько я понимаю, опция -X должна равномерно распределять аргументы между заданиями. Тем не менее, я получаю очень искаженный дистрибутив:

user@host:/tmp/ptest$ count() { > echo $# > } user@host:/tmp/ptest$ export -f count  user@host:/tmp/ptest$ count *.jpg 5825 user@host:/tmp/ptest$ parallel -X count ::: *.jpg 5039 197 197 197 195 

Интересно, что использование только подмножества файлов приводит к равномерному распределению параметров:

user@host:/tmp/ptest$ count p129*.jpg 975 user@host:/tmp/ptest$ parallel -X count ::: p129*.jpg 244 244 244 243  user@host:/tmp/ptest$ count p12*.jpg 4007 user@host:/tmp/ptest$ parallel -X count ::: p12*.jpg 1002 1002 1002 1001  user@host:/tmp/ptest$ count p13*.jpg 1818 user@host:/tmp/ptest$ parallel -X count ::: p13*.jpg 455 455 455 453 

Почему неправильно в первом случае и как я могу это исправить?

2

1 ответ на вопрос

3
Ole Tange

-X распределяет равномерно, когда он поражает EOF.

Так что в вашем случае он заполняет буфер для полной командной строки (5039 имен) и запускает ее. Затем он читает еще 800 имен, пока не достигнет EOF. Этого недостаточно, чтобы начать полную работу, поэтому они распределяются по рабочим местам.

Смотрите страницу 37 https://zenodo.org/record/1146014

Это делается таким образом, чтобы избежать необходимости читать все задания заранее, так как все задания могут быть недоступны (подумайте tail -f file.names | parallel ...).

Возможно, было бы лучше, если бы GNU Parallel читал достаточно имен, чтобы заполнить все рабочие места перед началом следующего задания в -Xрежиме, чтобы он мог обнаружить EOF раньше. Это, однако, не было реализовано. Патч приветствуется.

Обходной путь должен использовать:

ls *.jpg | parallel --round --pipe -N1 parallel -Xj1 count 

Он не может выводить после каждого задания, но может выполнять вывод с буферизацией:

ls *.jpg | parallel --lb --round --pipe -N1 parallel --lb -Xj1 count 

Если имена файлов содержат \ n:

printf '%s\0' *.jpg | parallel --recend '\0' --round --lb --pipe -N1 parallel -0Xj1 count 
Спасибо за объяснение, почему это происходит. Есть ли способ достичь или приблизить желаемое поведение? Zoltan 6 лет назад 0
Кстати, связанный материал выглядит как отличная книга! Zoltan 6 лет назад 1