如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 并且内存管理可以在后台执行类似的操作。
答案 0 :(得分:2)
您可以使用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只是同一数据帧的另一个视图。