Утечка памяти в многопроцессорной среде Python в Ubuntu, но не в Windows - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь разделить и изменить порядок данных приблизительно из 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

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