Python - многопроцессорность - PullRequest
1 голос
/ 14 октября 2019

Я хочу выполнить следующую задачу:

У меня есть файл ввода tsv:

0   2   0
2   5   1
5   10  2
10  14  5

И я хочу преобразовать его в следующий формат:

0
0
1
1
1
2
2
2
2
2
5
5
5
5

Мне удается сделать это с помощью следующего кода: (Начало - это первый столбец входного файла, остановка - второй, а глубина - третий.)

def parse(i):
    out = []
    start = int(i[0])
    stop = int(i[1])
    depth = i[2]
    times = stop - start
    out += times * [depth]
    return(out)

signal = []
for i in tqdm(file):
    x = parse(i)
    signal.append(x)

with open('output.txt', 'w') as f:
    for item in signal[0]:
        f.write("%s\n" % item)

Хотя мой входной файл имеет16720973 строк, и у меня есть много файлов из них, поэтому я попытался выполнить параллельные процессы, чтобы минимизировать время выполнения, с помощью следующего кода:

def parse(start, stop, depth):
    out = []
    times = int(stop) - int(start)
    out += times * [depth]
    return(out)

signal = []
poolv = multip.Pool(20)
x = [poolv.apply(parse, args=(i[0], i[1], i[2])) for i in tqdm(file)]
signal.append(x)
poolv.close()

Но не было никакой разницы во времени выполнения, и я думаю, что не было нескольких процессов,Есть ли какая-либо ошибка или лучший способ решить эту проблему, чтобы минимизировать время выполнения?

1 Ответ

1 голос
/ 15 октября 2019

документы для применения (func [, args [, kwds]]) говорят, что

Блокируется, пока результат не будетготовы. Учитывая эти блоки, apply_async () лучше подходит для параллельной работы. Кроме того, func выполняется только в одном из работников пула.

Это означает, что вы обрабатываете строки входного файла, последовательно блокируя пул, пока результаты не будут получены одним из работников пула. Во-вторых, я не думаю, что вы получите заметное ускорение, пытаясь разделить обработку разных строк входного файла между работниками пула. Я скажу вам больше, я думаю, вы немного замедлите весь процесс, тратя больше времени на передачу данных между процессами, чем фактически экономя время на самой обработке, так как в вашем случае это не длительный процессjob.

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

КСТАТИ Если вы найдете это полезным, вот как сделать обработку, используя bash и awk в одну строку:

while read line; do echo $line | awk '{for(i = 0; i < $2 - $1; i++) print $3}'; done < input.txt > output.txt

Это ваше input.txt:

0   2   0
2   5   1
5   10  2
10  14  5

И это то, что вы получаете в файле output.txt:

0
0
1
1
1
2
2
2
2
2
5
5
5
5

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...