Обработка больших файлов с помощью многопроцессорной обработки в Python: как загружать ресурсы только один раз за процесс? - PullRequest
1 голос
/ 08 июля 2019

Python's multiprocessing.Pool.imap очень удобно обрабатывать большие файлы построчно:

import multiprocessing

def process(line):
    processor = Processor('some-big.model') # this takes time to load...
    return processor.process(line)

if __name__ == '__main__':
    pool = multiprocessing.Pool(4)
    with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
        for processed_line in pool.imap(process, infile):
            outfile.write(processed_line)

Как я могу убедиться, что такие помощники, как Processor в приведенном выше примере, загружаются только один раз? Возможно ли это вообще, не прибегая к более сложной / многословной структуре, включающей очереди?

1 Ответ

0 голосов
/ 08 июля 2019

multiprocessing.Pool позволяет инициализировать ресурс с помощью параметров initializer и initarg.Я был удивлен, узнав, что идея состоит в том, чтобы использовать глобальные переменные, как показано ниже:

import multiprocessing as mp

def init_process(model):
    global processor
    processor = Processor(model) # this takes time to load...

def process(line):
    return processor.process(line) # via global variable `processor` defined in `init_process`

if __name__ == '__main__':
    pool = mp.Pool(4, initializer=init_process, initargs=['some-big.model'])
    with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
        for processed_line in pool.imap(process, infile):
            outfile.write(processed_line)

Концепция не очень хорошо описана в документации multiprocessing.Pool Надеюсь, этот пример будет полезен другим.

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