Python 释放数据帧使用的内存的最佳方法
对于一个工作项目,我试图实现两个数据帧的逐行比较,这比直接比较内存中加载的两个数据帧占用更少的内存 因此,我们的想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个df执行相同的操作并比较散列 我不相信垃圾收集器会及时释放内存,并且考虑到数据帧是可变的,所以我认为最好的方法是对数据帧进行变异,使其成为空df。我后来也删除了它,只是为了确定 所以它似乎起作用了。。。某种程度上。我运行了内存分析器,是的,分配一个空的df可以释放很多内存,但是由于某些原因,并不是原始df使用的所有内存。例如,在第37行中,从拼花地板文件加载df会消耗4.5 Gb的内存,但在第42行中,我在其位置分配了一个空df,它释放了1.8 Gb,2.8 Gb仍被某些东西占用 我想,当我分配一个空的数据帧时,它可能出于某种原因保留了一个维度,只是用NaN填充它,但是没有,在分配了一个空的df之后,数据帧的形状是(0,0) 即使当我试图删除下一行中对dataframe的引用时,也不会释放额外的内存。当我处理第二个数据帧时也会发生同样的情况Python 释放数据帧使用的内存的最佳方法,python,pandas,memory-management,Python,Pandas,Memory Management,对于一个工作项目,我试图实现两个数据帧的逐行比较,这比直接比较内存中加载的两个数据帧占用更少的内存 因此,我们的想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个df执行相同的操作并比较散列 我不相信垃圾收集器会及时释放内存,并且考虑到数据帧是可变的,所以我认为最好的方法是对数据帧进行变异,使其成为空df。我后来也删除了它,只是为了确定 所以它似乎起作用了。。。某种程度上。我运行了内存分析器,是的,分配一个空的df可以释放很多内存,但是由于某些原因,并不是原始d
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)
所有这些似乎都有完全相同的效果