У меня есть файл worker.php, как показано ниже
<?php
$data = $argv[1];
//then some time consuming $data processing
и я запускаю это как очередь на работу бедного человека, используя GNU параллельно
while read LINE; do echo $LINE; done < very_big_file_10GB.txt | parallel -u php worker.php
какой тип работает, развивая 4 процесса PHP, когда я нахожусь на машине с 4 процессорами.
Но это все еще кажется мне довольно синхронным, потому что read LINE по-прежнему читает по одной строке за раз.
Поскольку размер файла составляет 10 ГБ, мне интересно, можно ли каким-то образом использовать параллельное чтение одного и того же файла параллельно, разделив его на n частей (где n = число моих процессоров), что ускорит мой импорт в n раз (в идеале).
Не нужно делать while
бизнес:
parallel -u php worker.php :::: very_big_file_10GB.txt
-u
Разгруппировать вывод. Используйте это, только если вы не собираетесь использовать выходные данные, так как выходные данные из разных заданий могут смешиваться.
::::
Источник ввода файла. Эквивалентно -a
,
Я думаю, что вам будет полезно прочитать по крайней мере главу 2 (Изучите GNU Parallel за 15 минут) из «GNU Parallel 2018». Вы можете купить его на
http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html
или загрузите его по адресу: https://doi.org/10.5281/zenodo.1146014
Других решений пока нет …