Многопоточность скрипта Bash
У меня есть текстовый файл 8 ГБ, и я должен запустить скрипт Python для каждой строки в файле и сохранить часть вывода.
Есть ли способ, которым я могу разделить это на несколько процессов, чтобы заставить его работать быстрее, в bash?
Вот мой текущий скрипт bash:
#!/bin/bash
filename='before.txt'
while read p; do
python py-hex.py $p | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt
done < $filename
1 ответ
Я думаю, что вам нужно предоставить более подробную информацию об ограничениях - например, должен ли вывод в файле convert.txt быть в том же порядке, что и before.txt, сколько времени занимает каждый разбор скрипта python? Если порядок вывода не зависит от ввода, вы можете сделать это, создав фоновые процессы и запустив их количество в каждом цикле - число, которое, я полагаю, зависит от того, сколько потоков будет обрабатывать ваш ЦП.
Что-то вроде следующего может (или не может) соответствовать вашим целям:
#! /bin/bash
threads=4;
threads=$(( $threads - 1))
while read filein
do
python py-hex.py $filein | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt &
for thread in `seq $threads`
do
read filein
python py-hex.py $filein | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt &
done
done < $filename
Примечания: Это предполагает, что ваш файл Python может обрабатывать пустые входные данные (т. Е. Если количество команд, не делимых точно на число потоков, будут иметь несколько пустых строк - вы всегда можете проверить это перед выполнением внутреннего цикла.
Этот скрипт предполагает, что вы не заботитесь о порядке вывода.