Я пытаюсь вывести каждую запись в словаре в файл 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
, чтобы избежать ненужных использование памяти из-за осложнений копирования при записи из-за подсчета ссылок, но, похоже, не помогает).
Как мне уменьшить эти накладные расходы, продолжая распараллеливать этот этап?