最佳实践 - 数据争吵时的内存管理

数据挖掘 Python 熊猫 数据
2022-03-02 12:36:53

我想知道在内存管理方面学习最佳实践的最佳资源是什么。例如,假设我有以下代码:

df.read_csv() #one instance of a df
df1 = df.drop_duplicates #another instance of a df, total 2
df1_melt = df1.melt() #another instance of a df
df1_aggregated = df1_melt.groupby()... #another instance, total 4
df_mutual = pd.merge(df1_aggregated, df1_melted) #created another instance of a df, total 5

在上面的示例中,我们创建了 5 个数据帧并将它们存储在内存中,但我们实际上只对一个感兴趣。我读过你可以将这些变量的引用计数减少到0,然后当你删除变量时,它可能会被垃圾回收。有没有更好的编程方法可以避免在内存中创建多个数据副本?

1个回答

对 ML / DS 特别有用的编程最佳实践:

  • 了解并处理您的数据类型,例如使用 dict,并将此 dict 作为和 agrument 传递给您读取的 csv。您可以通过使用正确类型的 float / int 和 category 而不是字符串来减少重要的内存使用量。浮点精度在 ML 中并不重要(通常通过更快的计算来获得更好的统计性能)。

  • 作为模型构建过程的一部分,进行一些变量选择(以减少列数)或抽样(以减少行数)很有用。有时只是为了测试您的管道,有时是为了获得基线,有时是作为长期解决方案。

  • 你必须积极避免增加你的 dataframes我通常通过查看消耗的内存来实时检查。(通过像 htop 这样的命令行界面,或者通过 python 环境中的临时内存请求)。这意味着您必须查看复制 df 的函数。然后你需要做一些工作来找到低内存的替代方案(使用矢量化计算,使用'in_place = True'选项......等)。在此步骤中,您还必须检查您的操作是否未升级您在第一部分中指定的数据类型。

  • 自己打扫干净您必须删除不使用的对象(预处理后的原始数据,刚刚拆分的整个数据......等等)。基本上可以在任何地方使用,并且经常使用del()垃圾收集器。gc.collect()