【问题标题】:How do I release memory used by a pandas dataframe but not slices?如何释放熊猫数据帧使用的内存而不是切片?
【发布时间】:2018-07-30 20:47:55
【问题描述】:

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 并且内存管理会在后台执行类似的操作。

【问题讨论】:

    标签: python pandas memory memory-management subset


    【解决方案1】:

    您可以使用 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 只是同一数据帧的另一个视图。

    【讨论】:

    • 好的,这将使我们成为其中的一部分。如果我从 df 中删除所有列,是否会将它们从 df_column_slice 中删除?如果我删除了整个数据框怎么办?
    猜你喜欢
    • 2016-12-30
    • 2019-10-02
    • 2019-10-29
    • 2023-01-26
    • 2020-08-30
    • 1970-01-01
    • 2015-09-21
    • 2016-03-06
    相关资源
    最近更新 更多