python - 如何释放熊猫数据框使用的内存而不是切片?
问题描述
如本问题所述,可以显式释放数据帧的内存。我遇到了一个问题,该问题是该问题的扩展。我经常导入整个数据集并对其进行选择。选择往往有两种形式:
df_row_slice = df.sample(frac=0.6)
df_column_slice = df[columns]
在我的代码中的某个点过去,我知道我将不再对原始 df 进行任何引用。有没有办法释放切片未引用的所有内存?我意识到切片时可以使用 .copy() ,但是这种临时重复会导致我超出记忆力。
更新
在回复之后,我认为该方法是从原始框架中删除列或行。
df_column_slice = df[columns]
cols_to_drop = [i for i in df.columns if i not in columns]
df = df.drop(columns=cols_to_drop)
或者
df_row_slice = df.sample(frac=0.6)
df = df.drop(df_row_slice.index)
希望垃圾收集能够正常工作以释放内存。打电话会不会很聪明
import gc
gc.collect()
只是为了安全?顺序重要吗?我可以在切片之前放下没有问题。在我的具体情况下,我制作了两种类型的几片。我希望我可以del df和内存管理在引擎盖下做这样的事情。
解决方案
您可以使用 df.drop 删除未使用的列和行。
import os, psutil, numpy as np
def usage():
process = psutil.Process(os.getpid())
return process.memory_info()[0] / float(2 ** 20)
df_all = pd.read_csv('../../../Datasets/Trial.csv', index_col=None)
usage()
cols_to_drop = df_all.loc[:5,'Col3':].columns.values
df_all = df_all.drop(columns=cols_to_drop)
usage()
这里首先usage()
为我返回 357,第二次返回 202。
如果你需要同时拥有 df_row_slice 和 df_column_slice,你可以这样做:
cols_to_drop = df_all.loc[:5,'Col3':].columns.values
rows_to_drop = np.random.choice(df.index.values, int(df.shape[0]*0.4))
df_row_slice = df.drop(rows_to_drop)
df = df.drop(columns=cols_to_drop)
df_column_slice = df
这里 df_column_slice 只是同一数据帧的另一个视图。
推荐阅读
- elasticsearch - 在嵌套对象中搜索
- r - 如何使用自定义阈值按行自定义数据表
- servlets - 限制同一用户跨 2 个 Web 应用程序的多次登录
- firebase - 如何使用 Firebase 为单页应用程序实现 sitemap.xml 文件?
- python - 如何跨 wxPython 框架传递信息?
- php - Mysqli 准备好的语句从数组动态构建 INSERT 查询
- jdbc - kafka 连接 JDBC 接收器。展平 JSON 记录时出错
- r - 'centralityPlot(network)' 没有打印出中间性和接近性
- java - 如何检索用户个人资料名称信息,例如姓名和电子邮件以及个人资料照片?
- c# - Xunit - 以列表或对象为参数的单元测试