【问题标题】:Getting a MemoryError because list/array is too large由于列表/数组太大而出现 MemoryError
【发布时间】:2014-07-06 11:19:48
【问题描述】:

问题

我必须下载object_x。为简单起见,object_x 包含一系列 integers 加起来为 1000。下载不规律。我以看似随机的顺序接收整数组或chunks,我需要跟踪它们,直到我拥有所有1000 来组成最终的object_x

传入的块也可以重叠,例如:

Chunk 1: integers 0-500
Chunk 2: integers 600-1000
Chunk 3: integers 400-700

当前方法

object_x 创建为list,其中包含其所有组成整数0-1000。下载chunk 时,从object_x 中删除构成chunk 的所有整数。继续这样做,直到 object_x 为空(此时已知为完整)。

object_x = range(0,1000)

# download chunk 1
chunk = range(0, 500)

for number in chunk:
    if number in object_x:
        object_x.remove(number)

# repeat for every downloaded chunk

结论

此方法非常占用内存。如果 object_xchunk 太大,脚本会抛出 MemoryError。

我正在寻找一种更好的方法来跟踪构建object_x 的块。有任何想法吗?我正在使用 Python,但我猜语言并不重要。

【问题讨论】:

    标签: python arrays list memory integer


    【解决方案1】:

    在这种情况下,流媒体非常重要。在内存中做所有事情是一个坏主意,因为您可能没有足够的内存(如您的情况)。您可能应该将块保存到磁盘,跟踪您下载了多少,当您达到 1000 时,在磁盘上处理它们(或将它们一一加载到内存中进行处理)。

    C# Security: Computing File Hashes”是我最近写的一篇文章 - 这是一个不同的主题,但它确实说明了流式传输的重要性。

    【讨论】:

    • 那么您如何跟踪它们呢?不幸的是,我无法执行您的建议,因为我无法控制此代码的部署。我所能做的就是优化我的代码以不遇到任何错误,因此请按照这些思路寻找解决方案。
    猜你喜欢
    • 2015-11-09
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2014-10-10
    • 1970-01-01
    • 2018-07-10
    • 2015-09-27
    相关资源
    最近更新 更多