首页 > 解决方案 > 创建熊猫数据框会产生巨大的系列

问题描述

我正在使用SummaryTrackerfrom pympler.tracker。我试图弄清楚为什么我的脚本被杀死了,尽管我的代码中的数据帧不应该超过大约。0,4gb,因为我有一个形状为18125×35232的矩阵(如果该数字不正确,我可以更改它),并且在创建此数据框时 pandas Series 存在于我不太了解的 RAM 中。现在我正在使用跟踪器来跟踪哪些对象使我的脚本停止,这是添加 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 = 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

我知道我需要更多空间来存储数据帧,但我没有在这段代码中创建系列,我想知道为什么 pandas.series 对象会阻止 1.15gb。这是内存泄漏吗?如果是,我该如何解决?如果没有,我可以以某种方式优化我的代码,以免发生这种情况吗?还是熊猫在创建数据框时的正常行为?在此之后,我将两个数据帧相互连接起来,5.69gbpandas.series.

标签: pythonpandasdataframememory-managementmemory-leaks

解决方案


推荐阅读