【问题标题】:Memory error when running medium sized merge function ipython notebook jupyter运行中型合并功能 ipython notebook jupyter 时出现内存错误
【发布时间】:2016-02-06 15:57:36
【问题描述】:

我正在尝试使用 for 循环合并大约 100 个数据帧,但出现内存错误。我正在使用 ipython jupyter notebook

以下是数据示例:

    timestamp   Namecoin_cap
0   2013-04-28  5969081
1   2013-04-29  7006114
2   2013-04-30  7049003

每帧大约 1000 行长

Here's the error in detail, I've also include my merge function.

My system is currently using up 64% of it memory

我已经搜索过类似的问题,但似乎大多数都是针对 >1GB 的非常大的数组,相比之下我的数据相对较小。

编辑:有些可疑。我之前写过一个 beta 程序,这是用 4 个数据帧进行测试,我只是通过 pickle 导出它,它是 500kb。现在,当我尝试导出 100 帧时,出现内存错误。但是,它会导出一个 2GB 的文件。所以我怀疑我的代码在某处创建了某种循环,创建了一个非常大的文件。注意 100 帧存储在字典中

EDIT2:我已将 scrypt 导出为 .py

http://pastebin.com/GqaHr7xc

This is a .xlsx that cointains asset names the script needs

该脚本获取有关各种资产的数据,然后对其进行清理并将每个资产保存到字典中的数据框中

如果有人可以查看一下,看看有没有什么问题,我将不胜感激。否则,请告知我可以运行哪些测试。

EDIT3:我发现很难理解为什么会发生这种情况,代码在测试版中运行良好,我现在所做的就是添加更多资产。

EDIT4:我对对象(dfs 的字典)进行了大小检查,它是 1,066,793 字节

EDIT5:问题出在硬币 37 的合并函数中

for coin in coins[:37]:
    data2['merged'] = pd.merge(left=data2['merged'],right=data2[coin], left_on='timestamp', right_on='timestamp', how='left')

这是发生错误的时间。 for coin in coins[:36]:' doesn't produce an error howeverfor coin in coin[:37]:' 产生错误,有什么想法吗?

EDIT6:第 36 个元素是 'Syscoin',我做了 coin.remove('Syscoin') 但是内存问题仍然存在。所以不管是什么硬币,硬币的第36个元素似乎都有问题

EDIT7:goCards 建议似乎有效,但是代码的下一部分:

merged = data2['merged']
merged['Total_MC'] = merged.drop('timestamp',axis=1).sum(axis=1)

产生内存错误。我被难住了

【问题讨论】:

  • 你试过把notebook转换成py文件用python运行吗?
  • 我确实想过这样做,但我想我会先在这里问。由于这是第一个回复,我现在就尝试一下
  • @goCards 我想保存数据帧字典,你知道最好的办法是考虑恢复吗?
  • 每个数据框是如何相互关联的?他们有相同的钥匙?还是只是一张水平分割的大桌子?
  • 哇,好吧,我收回我说的话,我刚刚导出了数据帧的字典,而且泡菜文件不仅是 2GB,而且我在尝试保存它时遇到了内存错误。所以我不知道它是否正确保存。每帧代表各种资产的时间戳和市值,其名称是字典中的键。

标签: pandas out-of-memory ipython


【解决方案1】:

关于存储,我建议使用简单的 csv 而不是 pickle。 CSV 是一种更通用的格式。它是人类可读的,您可以更轻松地检查数据质量,尤其是随着数据的增长。

file_template_string='%s.csv'
for eachKey in dfDict:
    filename = file_template_string%(eachKey)
    dfDict[eachKey].to_csv(filename)

如果您需要为文件添加日期,您还可以在文件名中添加时间戳。

import time
from datetime import datetime
cur = time.time()
cur = datetime.fromtimestamp(cur)
file_template_string = "%s_{0}.csv".format(cur.strftime("%m_%d_%Y_%H_%M_%S"))

您的代码中有一些明显的错误。

for coin in coins: #line 61,89
for coin in data: #should be

df = data2['Namecoin'] #line 87
keys = data2.keys()
keys.remove('Namecoin')
for coin in keys:
    df = pd.merge(left=df,right=data2[coin], left_on='timestamp', right_on='timestamp', how='left')

【讨论】:

  • 谢谢,我会记住这一点。我的代码中似乎有一些错误正在创建一个比它应该更大的文件
  • 嗯,很有趣,所以我进行了更改,但仍然出现内存错误。你能把你的整个代码贴出来让我比较一下吗?
  • 问题似乎比预期的要严重。我又发了一篇你想看的帖子stackoverflow.com/questions/35255712/…
【解决方案2】:

同样的问题发生在我身上! “MemoryError:”笔记本执行熊猫。在发布之前,我还丝网印刷了很多观察结果。

重新安装 Anaconda 没有帮助。后来意识到我正在使用 IPython 笔记本而不是 Jupyter 笔记本。切换到 Jupyter 笔记本。一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2017-05-18
    • 2021-09-13
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多