Расширяемая структура данных Pandas - минимизирует потребление памяти
Многим из вас это может показаться дублирующим вопросом, но я не смог найти удовлетворительного ответа.
У меня есть объект данных TimeSeries, к которому я добавляю данные в худшем случае каждые 200 мс. Теперь, это очень очень много памяти, так как я понимаю, что нужно заново создать базовые структуры данных, и это, похоже, не очищает старые объекты. Я пробовал что-то вроде
old = mydata
mydata = mydata.append(...)
del old
что не имеет никакого значения вообще!
Проблема в том, что мой процесс работает на хосте с только 1 ГБ памяти, и этот вид обработки довольно быстро истощает память хоста.
Мне нужно, чтобы данные в памяти сохранялись как минимум за последние 30 часов, так как аналитика выполняется каждые 200 мс / каждый тик.
Любые предложения по оптимизации памяти - и при этом сохраняйте функциональность pandas.TimeSeries (нарезка на основе временных интервалов).
1 ответ
append
Операция возвращает новую серию. Таким образом, вы копируете данные каждый раз, что довольно неэффективно (с точки зрения скорости и памяти). Обычный способ справиться с этим - предварительно создать больший размер, чем необходимо, а затем просто ввести значения. Изменение размера в случае необходимости. (это то, как Python списки / dict делают это также).
Я привожу здесь пример, а также способ использования HDFStore
сделать это.
In [7]: df = DataFrame(index=range(5),columns=list('AB'))
In [8]: df.iloc[0] = Series(dict(A = 10, B = 5))
In [9]: df.iloc[1] = Series(dict(A = 11, B = 6))
In [10]: def f(x,indexer):
....: return x.iloc[0:indexer]*2
....:
In [11]: f(df,2)
Out[11]:
A B
0 20 10
1 22 12
In [12]: df.iloc[2] = Series(dict(A = 12, B = 7))
In [13]: f(df,3)
Out[13]:
A B
0 20 10
1 22 12
2 24 14