【问题标题】:Memory issue when iterating over a list or arrays迭代列表或数组时的内存问题
【发布时间】:2016-03-02 01:08:17
【问题描述】:

我有一个数组列表,例如:

arr = [array([1,2,3,4,5]), array([1,4,6,7]) .......] 

其中包含 40000 个数组。理想情况下,我希望将其作为 2d numpy 数组,但我不能保证所有数组的长度都相同。

我想对列表中的所有值做一些基本的事情,例如:

out = (3*arr)+2

但我很快就用完了内存(在 32GB 机器上),所以它显然非常低效。我尝试遍历列表并将结果附加到新列表,但这同样效率低下。

有没有一种有效的方法来实现这一点?

--------------- 编辑 --------------

arr 看起来像:

[array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131]),
array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131]),
array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131])]

【问题讨论】:

  • 您需要同时将所有值保存在内存中吗?您可能希望使用生成器来懒惰地处理这些值,以便您可以尽快摆脱不再需要的数据部分。
  • 不,我不需要同时将它们全部存储在内存中。一次只有每个输入数组和输出值
  • 你的arr怎么样了?其中最大的数组是什么?在 32GB 的机器上内存不足似乎很奇怪
  • 我从一个简单的一维数组 (A) 开始,其中包含 432 个值。我还有另外两个形状为 (40000, 1) 的数组,B 和 C。我想使用 B 和 C 中的每个值来切片 A。类似于:A[B:C]。由于切片只接受整数而不是列表,所以我使用“for”循环来遍历 B 的长度,并附加 A[B[i]:C[i]] 并将结果附加到 arr。因此,arr 中的每个数组都是我开始使用的原始数组的子集
  • 如果每个切片都独立于其他切片进行处理,您应该跳过构建包含所有切片的大列表,并在创建后立即对每个切片进行处理(例如for b, c in zip(B, C):out = 3*A[b:c]-2 -- 大概你会在循环中使用out 做更多的事情,但我不知道是什么)。

标签: python arrays numpy memory


【解决方案1】:

如果你真的像你写的那样做,你很可能会遇到内存问题,因为

out = (3*arr)+2

复制您的数组 3 次,然后尝试附加到它。该常数越大,数组越大,因此内存爆炸。

要在没有内存问题的情况下实现您想要的,请使用

out = [[3*x + 2 for x in arr_list] for arr_list in arr]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2019-10-15
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多