使用熊猫时如何解决“内存错误”?

时间:2020-04-02 09:48:24

标签: python pandas memory jupyter-notebook swapfile

我知道Memors错误是使用Pandas库的不同功能时的常见错误。 我想在几个方面寻求帮助。在描述问题之后,下面将提出我的问题。

我的操作系统是Ubuntu 18,工作区是Anaconda框架内的jupyter笔记本,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. 我想了解如何计算熊猫操作所需的内存量。 从有关此主题的问题数量来看,读取,合并等操作时会发生内存错误。是否可以包含交换文件来解决此问题?

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

1 个答案:

答案 0 :(得分:0)

我建议指定列的dtype,它可能试图将它们作为对象类型读取-例如如果使用DataFrame.from_dict,则指定dtype参数; dtype={'a': np.float64, 'b': np.int32, 'c': 'Int64'}。创建数据框的最佳方法是在执行操作时从字典对象开始-切勿使用dataframe.append,因为它的效率很低。

查看其他程序是否也在占用系统内存,并在尝试执行加载之前将其杀死。

您还可以尝试查看内存错误发生的时间-50k,70k,100k?

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

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