Чрезмерное использование памяти с многопроцессорным пулом - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь вывести каждую запись в словаре в файл JSON, используя многопроцессорность в Python 3.6. Вот код:

def export_json(t):
    path = os.path.join(t[2], t[0] + '.json')
    with open(path, 'w') as json_file:
        json.dump(t[1], json_file, indent = 4)

class TrackExportHelper():

    def execute(self):
        pool = Pool(processes = self.num_threads)
        pool.map(export_json, self.enumerate())

    def enumerate(self):
        for track in self.tracks:
            yield (track, copy.deepcopy(self.tracks[track]), self.output_dir)

Это небольшая часть большой базы кода, но self.tracks в основном является единственным объектом данных в программе, загружается из большого файла JSON и обрабатывается перед мы переходим к этому этапу. Перед вызовом execute объем памяти составляет около 34 ГБ. Однако при пуле из 12 процессов использование памяти достигает 160 ГБ. Комментирование фактической строки json.dump, похоже, не влияет на использование памяти.

Разумны ли такие накладные расходы? Я ожидал не более чем вдвое большего использования памяти по сравнению с исходными данными с небольшими накладными расходами, поскольку каждый словарь верхнего уровня копируется один раз, однако удаление deepcopy уменьшает использование памяти лишь незначительно (в основном я добавил deepcopy, чтобы избежать ненужных использование памяти из-за осложнений копирования при записи из-за подсчета ссылок, но, похоже, не помогает).

Как мне уменьшить эти накладные расходы, продолжая распараллеливать этот этап?

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