Утечка памяти при получении данных из прокси-класса - PullRequest
0 голосов
/ 15 апреля 2019

Я обрабатываю данные из нескольких файлов.Для достижения цели я создал класс для распространения данных.Я запустил 4 процесса, которые посещают один и тот же класс и получают данные.Проблема в том, что если я использую метод класса (retrieve ()) для извлечения данных, память будет продолжать расти.Если я этого не сделаю, память стабильна, даже если данные обновляются с помощью getData ().Как сохранить стабильное использование памяти при получении данных?Или любой другой способ достижения той же цели?

import pandas as pd
from multiprocessing import Process, RLock
from multiprocessing.managers import BaseManager 

class myclass():
    def __init__(self, path):
        self.path = path
        self.lock = RLock()
        self.getIter()

    def getIter(self):
        self.iter = pd.read_csv(self.path, chunksize=1000)

    def getData(self):
        with self.lock:
            try:
                self.data = next(self.iter)
            except:
                self.getIter()
                self.data = next(self.iter)

    def retrieve(self):
        return self.data

def worker(c):
    while True:
        c.getData()
        # Uncommenting the following line, memory usage goes up
        data = c.retrieve()

#Generate a testing file
with open('tmp.csv', 'w') as f:
    for i in range(1000000):
        f.write('%f\n'%(i*1.))

BaseManager.register('myclass', myclass)
bm = BaseManager()
bm.start()
c = bm.myclass('tmp.csv')

for i in range(4):
    p = Process(target=worker, args=(c,))
    p.start()

1 Ответ

0 голосов
/ 16 апреля 2019

Я не смог ни выяснить причину, ни решить ее, но после изменения типа данных для возвращаемой переменной с pandas.DataFrame на str (строка json) проблема решается.

...