Расширяемая структура данных 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
Другие вопросы по тегам