Я пытаюсь разделить и изменить порядок данных приблизительно из 100 файлов.Файлы содержат информацию о прибл.400 тыс. Пользователей и упорядочены в хронологическом порядке.Цель состоит в том, чтобы перебрать 100 файлов и создать отдельный файл для каждого пользователя.
Подход заключается в использовании многопроцессорной библиотеки pythons для создания нескольких процессов: - Один пул обработки, который загружает данные, сортирует ихи добавлять партии в очередь.Каждая партия содержит данные для одного пользователя.- Один процесс, который исключает элементы из очереди и добавляет пакеты в очередь
. Теперь приведенный ниже код работает на ноутбуке с Windows 10, Python 3.7.Однако я пытаюсь запустить его на сервере с Ubuntu 16.04 и Python 3.5.В то время как в Windows код работает без проблем, серверу не хватает памяти.Теперь ноутбук имеет 8 ГБ оперативной памяти, а сервер - 256 ГБ.Чего мне здесь не хватает?
РЕДАКТИРОВАТЬ: я заменил код упрощенной версией, которую вы сможете запустить.Теперь код создает процессы, которые добавляют в очередь пустые массивы.Другой процесс исключает массивы.Во время очередей массивов, размер очереди печатается.Размер очереди остается низким, так как элементы в очереди.Однако использование памяти продолжает увеличиваться.
import numpy as np
import sys
import multiprocessing
import time
def queue_remover(q):
while(1):
if not q.empty():
data = q.get()
def queue_adder(q, unused_number):
for _ in range(5):
q.put(np.zeros((1000,1000)))
print('q size ', q.qsize())
sys.stdout.flush()
time.sleep(1)
if __name__ == "__main__":
list_of_numbers = list(range(500))
m = multiprocessing.Manager()
queue = m.Queue(maxsize=40000)
writer = multiprocessing.Process(target=queue_remover, args=(queue,))
writer.start()
processing_pool = multiprocessing.Pool(processes=3, maxtasksperchild=1)
processing_pool.starmap(queue_adder, [(queue, number) for number in list_of_numbers])
processing_pool.close()
processing_pool.join()
writer.join()
РЕДАКТИРОВАТЬ: я только что запустил профилировщик памяти для профилирования отдельных процессов в течение примерно 2 минут в Windows и 8 минут в Ubuntu.Обратите внимание, что в обеих системах размер очереди печати остается близким к 0 - элементы обязательно удаляются из обоих.
Профиль памяти при работе в Windows
Профиль памяти при работе в Ubuntu