Создание pandas фрейма данных создает огромные серии - PullRequest
2 голосов
/ 31 января 2020

Я использую 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.

...