【问题标题】:Numpy hstack explodes memory [duplicate]Numpy hstack爆炸内存[重复]
【发布时间】:2014-07-12 05:11:55
【问题描述】:

我是 Python 新手,我不确定为什么当我使用 Numpy hstack 将两个 pandas 数据帧连接在一起时,内存使用量会急剧上升。 pandas.concat 的性能甚至更差——如果它能够完成的话——所以我正在使用 NumPy。

这两个数据帧比较大,但我有 20 GB 空闲 RAM(使用 11 GB,包括我要复制的两个数据帧)。

数据框 a 和 b 具有形状:

a.shape (66377, 30)
b.shape (66377, 11100)

当我使用np.hstack((a,b))时,免费的20GB已经完全用完了。

【问题讨论】:

  • 您的数据的dtype 是什么?对于 float64,b 应该是大约 5.5 GB,所以np.hstack 的结果也应该只增加大约 5.5 GB。

标签: python numpy pandas


【解决方案1】:

np.hstack 返回一个包含基础数据副本的新数组,因此当您执行此操作时,您的内存使用量增加了一倍。

您可以使用a.nbytesb.nbytes等检查每个数组的内存使用情况

【讨论】:

    【解决方案2】:

    in this thread 所示,不可能将数组追加到适当的位置,这样做效率不高,因为无法保证扩展数组在内存中保持连续。

    如果您在连接数组后删除对象ab,Python 的垃圾收集器应该释放您的内存:

    a = append(a, b, axis=1)
    del b
    

    如果它没有释放你可以强制它:

    import gc
    gc.collect()
    

    【讨论】:

    • 调用 gc 只会对循环引用做一些事情,无论如何你都不应该用 Numpy 来处理它们。
    • @Davidmh 你是对的,但是在我使用它解决了this application 中的内存泄漏之后,我对gc.collect() “上瘾”了。泄漏是由于 Cython+scipy.sparse.csr_matrix+Numpy 的一些问题,我仍然不知道......
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2016-08-02
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多