Утечка памяти при получении данных из прокси-класса
Я мульти-обработки данных из ряда файлов. Для достижения цели я создал класс для распространения данных. Я запустил 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 ответ
Я не смог ни выяснить причину, ни решить ее, но после изменения типа данных для возвращаемой переменной с pandas.DataFrame на str (строка json) проблема пошла.