Как распараллелить простой цикл в Python? - PullRequest
0 голосов
/ 03 апреля 2019

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

Я пробовал этот код, но не работает:

from joblib import Parallel, delayed

from Bio.Align.Applications import ClustalOmegaCommandline


def run(test):
    im = process_image(Image.open(test['Path'][i]))
    test_images.append(im)


if __name__ == "__main__":
    test_images = []
    test = range(len(test))

    Parallel(n_jobs=len(test)(
        delayed(run)(i) for i in len(test))

Я получил этоошибка:

Файл "", строка 16 задержана (запуск) (i) для i in len (тест)) ^ SyntaxError: неожиданный EOF при синтаксическом анализе

Мой цикл:

test_images = []
for i in range(len(test)):
  im = process_image(Image.open(test['Path'][i]))
  test_images.append(im)
test_images = np.asarray(test_images)

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

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Я не уверен, что распараллеливание - ответ на проблемы с памятью.

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

Или попробуйте генераторы . Там значения генерируются ленивыми (только если они необходимы), что приводит к меньшему потреблению памяти.

0 голосов
/ 03 апреля 2019

Можете ли вы попробовать следующее:

def process_image(img_path):
    img_obj = Image.open(img_path)
    # your logic here
    return im

def main():
    image_dict = {}
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for img_path, im in zip(test['Path'], executor.map(process_image, test['Path'])):
            image_dict[img_path] = im
    return image_dict

if __name__ == '__main__':
    image_dict = main()
    test_images = np.asarray(image_dict.values())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...