使用 Pandas 时如何解决内存错误?

How to get around Memory Error when using Pandas?

我知道Memors Error 是使用Pandas 库的不同函数时的常见错误。 我想在几个方面获​​得帮助。在描述问题之后,我的问题在下面提出。

我的OS是Ubuntu18,工作空间是Anaconda框架下的jupyter notebook,内存容量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')

转换少量数据很快enough.But当我将完整的数据集传递给函数时出现内存错误。 我跟踪 RAM 的消耗。函数不开始执行,不浪费内存。 我试图扩展交换文件。但这没有用,函数不访问它。

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

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

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

我建议指定列的数据类型,它可能会尝试将它们读取为 object 类型 - 例如如果使用 DataFrame.from_dict 然后指定 dtype 参数; dtype={'a': np.float64, 'b': np.int32, 'c': 'Int64'}。创建数据框的最佳方法是从字典 object 中创建数据框 - 永远不要使用 dataframe.append,因为它效率很低。

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

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

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

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