NUMPY操作:内存效率:PYTHON

时间:2014-08-02 23:34:41

标签: python macos ubuntu numpy out-of-memory

我有4GB RAM的内存限制。我需要在RAM中有2.5 GB的数据才能执行更多操作

import numpy
a = numpy.random.rand(1000000,100)## This needs to be in memory
b= numpy.random.rand(1,100)
c= a-b #this need to be in code in order to perform next operation
d = numpy.linalg.norm(numpy.asarray(c, dtype = numpy.float32), axiss =1)

创建c时,内存使用率爆炸,python被杀死。有没有办法加快这个过程。我在具有4GB RAM和单核的EC2 Ubuntu上执行此操作。当我在我的MAC OSX上执行相同的计算时,它很容易完成,没有任何内存问题,并且花费的时间更少。为什么会这样?

我能想到的一个解决方案是

d =[numpy.sqrt(numpy.dot(i-b,i-b)) for i in a]

我认为这对速度没有好处。

2 个答案:

答案 0 :(得分:2)

如果a的创建不会导致内存问题,并且您不需要保留a中的值,则可以通过修改{{1}来计算c到位:

a

否则,以较小的块或批量工作的想法是好的。使用列表推导解决方案,您实际上是在a -= b # Now use `a` instead of `c`. 的一行批量大小中从da计算b。您可以使用更大的批量大小来提高效率。这是一个例子;它包含您的代码(包含一些外观更改)和一个版本,该版本在ad2批量计算结果(称为batch_size)。

a

答案 1 :(得分:1)

如果内存是您的代码速度变慢和崩溃的原因,为什么不使用生成器而不是列表理解?

d =(numpy.sqrt(numpy.dot(i-b,i-b))for a in a)

生成器本质上提供了在迭代器中获取下一个对象的步骤。换句话说,在生成器的迭代器上调用next()方法之前,不会进行任何操作并且不会存储任何数据。我强调这一点的原因是我不希望你在打电话d =(numpy.sqrt(numpy.dot(i-b,i-b)) for i in a)时想到它会完成所有计算,而是存储指令。