首页 > 解决方案 > 使用 Pandas 时如何解决内存错误?

问题描述

我知道 Memors Error 是使用 Pandas 库的不同功能时的常见错误。我想在几个方面获​​得帮助。在描述了问题之后,我的问题如下制定。

我的操作系统是 Ubuntu 18,工作空间是 Anaconda 框架内的 jupyter notebook,RAM 容量 8Gb。

我解决的任务。

我有超过 100,000 个字典,其中包含用户访问站点的数据,就像这样。

{'meduza.io': 2, 'google.com': 4, 'oracle.com': 2, 'mail.google.com': 1, 'yandex.ru': 1, 'user_id': 3}

有必要从这些数据中形成一个 DataFrame。起初,我使用 append 函数在 DataFrame 中逐行添加字典。

for i in tqdm_notebook(data):
   real_data = real_data.append([i], ignore_index=True)

但是玩具数据集显示,这个功能需要很长时间才能完成。然后我直接尝试通过传递一个带有这样的字典的数组来创建一个 DataFrame。

real_data = pd.DataFrame(data=data, dtype='int')

转换少量数据已经足够快了。但是当我将完整的数据集传递给函数 Memory Eror 时出现。我跟踪 RAM 的消耗。该函数不会开始执行,也不会浪费内存。我试图扩展交换文件。但这不起作用,该功能无法访问它。

我知道要解决我的特定问题,我可以将数据分成几部分,然后将它们组合起来。但我不确定我是否知道解决这个问题的最有效方法。

  1. 我想了解如何计算 Pandas 操作所需的内存量。从这个题目的题数来看,在读取、合并等时会出现内存错误,是否可以包含一个交换文件来解决这个问题?

  2. 如何更有效地解决在DataFrame中添加字典的问题?“追加”工作效率不高。从完整的数据集中创建 DataFrame 效率更高,但会导致错误。我不了解这些过程的实现,但我想弄清楚像我的任务一样转换数据的最有效方法是什么。

标签: pythonpandasmemoryjupyter-notebookswapfile

解决方案


我建议指定列的 dtypes,它可能试图将它们读取为对象类型 - 例如,如果使用DataFrame.from_dictthen 指定 dtype 参数;dtype={'a': np.float64, 'b': np.int32, 'c': 'Int64'}. 创建数据框的最佳方法是使用字典对象 - 永远不要使用 dataframe.append,因为它确实效率低下。

查看是否有任何其他程序也在您的系统上占用内存,并在尝试加载之前将其杀死。

您也可以尝试查看内存错误发生在什么时候 - 50k、70k、100k?

调试数据框并查看正在加载的类型,并确保这些类型是最小的合适的(例如,布尔而不是对象)。

编辑:如果您有很多稀疏条目,特别是如果有很多不同的域作为标头,可能会使您的数据框变得非常大。将列更改为更“键:值”的方法可能会更好,例如 {'domain': 'google.ru', 'user_id': 3, 'count': 10}。您可能有 100k 列!


推荐阅读