Как добавить список во время параллельного цикла for из joblib - PullRequest
0 голосов
/ 07 октября 2019

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

from joblib import Parallel, delayed
import multiprocessing
from tqdm import tqdm
num_cores = multiprocessing.cpu_count()

Crazy_long_list=list(range(0,10000000,1))

def get_data(i):
    return ((i * 2),(i/2))

normal_output=[]
# Without parallel processing
for i in Crazy_long_list:
    normal_output.append(get_data(i))

Когда этот скрипт останавливается в любой момент, добавленный список остается. Поэтому я могу сохранить требуемый выход в .csv, а на следующий день загрузить его и запустить сценарий дальше от того места, где я закончил. Вы можете проверить это, запустив часть кода и остановив ее в произвольный момент. Данные должны быть сохранены.

print(normal_output[0:10])

[(0, 0.0),
 (2, 0.5),
 (4, 1.0),
 (6, 1.5),
 (8, 2.0),
 (10, 2.5),
 (12, 3.0),
 (14, 3.5),
 (16, 4.0),
 (18, 4.5)]

Мой подход к параллельному выполнению будет выглядеть примерно так:

parallel_data=[]
parallel_data=Parallel(n_jobs=num_cores, verbose=50)(delayed(get_data)(i)for i in tqdm(Crazy_long_list))

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

print(parallel_data)
[]
...