Python 释放数据帧使用的内存的最佳方法

Python 释放数据帧使用的内存的最佳方法,python,pandas,memory-management,Python,Pandas,Memory Management,对于一个工作项目,我试图实现两个数据帧的逐行比较,这比直接比较内存中加载的两个数据帧占用更少的内存 因此,我们的想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个df执行相同的操作并比较散列 我不相信垃圾收集器会及时释放内存,并且考虑到数据帧是可变的,所以我认为最好的方法是对数据帧进行变异,使其成为空df。我后来也删除了它,只是为了确定 所以它似乎起作用了。。。某种程度上。我运行了内存分析器,是的,分配一个空的df可以释放很多内存,但是由于某些原因,并不是原始d

对于一个工作项目,我试图实现两个数据帧的逐行比较,这比直接比较内存中加载的两个数据帧占用更少的内存

因此,我们的想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个df执行相同的操作并比较散列

我不相信垃圾收集器会及时释放内存,并且考虑到数据帧是可变的,所以我认为最好的方法是对数据帧进行变异,使其成为空df。我后来也删除了它,只是为了确定

所以它似乎起作用了。。。某种程度上。我运行了内存分析器,是的,分配一个空的df可以释放很多内存,但是由于某些原因,并不是原始df使用的所有内存。例如,在第37行中,从拼花地板文件加载df会消耗4.5 Gb的内存,但在第42行中,我在其位置分配了一个空df,它释放了1.8 Gb,2.8 Gb仍被某些东西占用

我想,当我分配一个空的数据帧时,它可能出于某种原因保留了一个维度,只是用NaN填充它,但是没有,在分配了一个空的df之后,数据帧的形状是(0,0)

即使当我试图删除下一行中对dataframe的引用时,也不会释放额外的内存。当我处理第二个数据帧时也会发生同样的情况

    37   4640.4 MiB   4568.7 MiB           1       original_data = pd.read_parquet(original)
    38                                         
    39                                             # Hash rows of the dataframe
    40   4675.3 MiB     34.9 MiB           1       hash_original = pd.util.hash_pandas_object(original_data)
    41                                             # Explicitly mutate the dataframe to make sure the memory is freed
    42   2866.1 MiB  -1809.2 MiB           1       original_data = pd.DataFrame()
    43   2866.1 MiB      0.0 MiB           1       del original_data
    44                                         
    45                                             # Same for modified data but also remove the newly added columns to compare like for like
    46   5875.6 MiB   3009.5 MiB           1       modified_data = pd.read_parquet(modified)
    47   5736.4 MiB   -139.2 MiB           1       modified_data.drop(list(added_cols), axis=1, inplace=True)
    48   5771.3 MiB     34.9 MiB           1       hash_modified = pd.util.hash_pandas_object(modified_data)
    49   3962.2 MiB  -1809.1 MiB           1       modified_data = pd.DataFrame()
    50   3962.2 MiB      0.0 MiB           1       del modified_data
    51                                         
    52   3962.3 MiB      0.1 MiB           1       result = hash_original.compare(hash_modified)
    53                                         
    54   3962.3 MiB      0.0 MiB           1       if not result.shape[0]:
    55   3962.3 MiB      0.0 MiB           1           return True
    56                                             else:
    57                                                 return result.index
对于手头的任务来说,尽可能释放所有内存是非常关键的。所以我的问题是:是什么占用了所有这些内存,以及如何确保它被正确释放

编辑: 也尝试过类似的事情

import gc

del original_data
gc.collect()
以及删除数据帧中的行/列:

original_data.drop([i for i in original_data.index], axis=0, inplace=True)
# and
original_data.drop([col for col in original_data.columns], axis=1, inplace=True)
所有这些似乎都有完全相同的效果