如何解决释放 Pandas 数据帧使用的内存的最佳方法
对于一个工作项目,我正在尝试对两个数据帧进行逐行比较,这比直接比较内存中加载的两个数据帧使用更少的内存。
所以这个想法是加载一个数据帧,将其行散列到一个单独的变量中,然后删除原始数据帧。然后对第二个 df 执行相同操作并比较哈希值。
不确定垃圾收集器会及时释放内存,并且考虑到 Pandas 数据帧是可变的,我认为最好的方法是改变数据帧并使其成为空的 df。之后我也删除了它,只是为了确保。
所以它似乎有效......有点。我运行了内存分析器,是的,分配一个空的 df 释放了大量内存,但由于某种原因,原始 df 并没有使用所有内存。例如,在第 37 行中,从镶木地板文件加载 df 消耗 4.5 Gb 内存,但在第 42 行中,我在其位置分配了一个空 df,它释放了 1.8 Gb 和 2.8 Gb 仍然被某些东西占用。
我想,也许当我分配一个空的数据框时,它出于某种原因保留了其中一个维度,只是用 nans 填充它,但不,在分配空的 df 后,数据框的形状是 (0,0)。
即使我尝试在下一行中删除对数据帧的引用,它也不会释放额外的内存。当我使用第二个数据框时也会发生同样的情况。
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],inplace=True)
似乎都具有完全相同的效果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。