Я использую SummaryTracker
от pympler.tracker
. Я пытаюсь выяснить, почему мой скрипт убит, хотя размер данных в моем коде не должен превышать прибл. 0,4 Гб, поскольку у меня есть матрица формы 18125 × 35232 (если это число неверно, я могу это изменить), и при создании этого кадра данных pandas Ряд присутствует в оперативной памяти, которую я не делаю действительно понимаю. Теперь я использую трекер, чтобы отследить, какие объекты делают мой скрипт остановленным, и это результат до добавления df:
types | # objects | total size
======================================== | =========== | ============
pandas.core.frame.DataFrame | 2 | 79.57 MB
pandas.core.indexes.base.Index | 3 | 1.60 MB
list | 14620 | 1.35 MB
str | 17814 | 1.25 MB
pandas._libs.index.ObjectEngine | 2 | 640.20 KB
numpy.ndarray | 17 | 145.17 KB
set | 3 | 132.66 KB
int | 3316 | 90.70 KB
pandas.core.series.Series | 1 | 20.15 KB
pandas.core.indexes.numeric.Int64Index | 1 | 20.02 KB
weakref | 101 | 7.89 KB
dict | 22 | 5.85 KB
type | 0 | 1.82 KB
pandas._libs.internals.BlockPlacement | 4 | 320 B
code | 2 | 288 B
После запуска этого кода:
import pandas as pd
data = pd.read_csv('../test_data/test.csv',
sep=';', encoding=data_encoding)
data.col_2 = data.col_2.astype(float)
data = data.pivot_table(index='index_name',
columns='col_name',
values='col_2')
Результат выглядит так:
types | # objects | total size
=================================================== | =========== | ============
pandas.core.frame.DataFrame | 3 | 2.92 GB
pandas.core.series.Series | 723 | 1.15 GB
list | 29950 | 2.74 MB
str | 33151 | 2.33 MB
pandas.core.indexes.base.Index | 3 | 1.60 MB
pandas.core.indexes.numeric.Int64Index | 3 | 966.09 KB
numpy.ndarray | 745 | 706.70 KB
pandas._libs.index.ObjectEngine | 3 | 660.23 KB
dict | 1494 | 329.34 KB
int | 7374 | 201.73 KB
set | 3 | 137.16 KB
pandas.core.internals.managers.SingleBlockManager | 723 | 84.73 KB
tuple | 1346 | 76.71 KB
pandas._libs.internals.BlockPlacement | 727 | 56.80 KB
pandas.core.internals.blocks.FloatBlock | 725 | 56.64 KB
Я понял, что мне понадобится больше места для фреймов данных, но я не создаю серии в этом коде, и мне интересно, почему 1,15 ГБ заблокировано объектами pandas .series , Это утечка памяти и если да, как я могу это исправить? Если нет, могу ли я как-то оптимизировать свой код, чтобы этого не произошло? Или это нормальное поведение pandas при создании фреймов данных? После этого я соединяю два кадра данных друг с другом, и становится еще хуже, если 5.69gb
заблокирован pandas.series
.