python - 如何释放 pandas 数据帧而不是切片使用的内存?

标签 python pandas memory memory-management subset

this 中所述问题是可以显式释放数据帧的内存。我遇到了一个问题,该问题是该问题的延伸。我经常导入整个数据集并对其进行选择。选择往往有两种形式:

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 只是同一数据帧的另一个 View 。

关于python - 如何释放 pandas 数据帧而不是切片使用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602062/

相关文章:

python - 从 "main program"获取所有预定义变量的子程序

python - 在 Pandas Dataframe 中展平列表的更快方法

python - 使用 pandas 数据框的 seaborn 热图

javascript - 如何获取浏览器内存中的javascript对象大小和计数

java - 为什么我们不能将所有字符串都存储在字符串池中?

python - tensorflow/keras 中的多线程

python - 以相同顺序随机打乱来自不同文件的数据和标签

python - 如何解决稀疏矩阵的缓慢 groupby 问题?

python - 如何根据分组列计算 pandas DF 值

C:链表正确使用malloc