python内存不足错误的解决方法有哪些?

时间:2013-11-13 17:15:38

标签: python numpy scipy out-of-memory

我正在将x,y,z点文件(LAS)读入python并遇到内存错误。我正在为我正在进行的项目的已知点之间插入未知点。我开始使用小文件(< 5,000,000点)并且能够读取/写入numpy数组和python列表没有问题。我收到了更多可以使用的数据(> 50,000,000点),现在我的代码因MemoryError而失败。

处理如此大量数据的选项有哪些?我不必一次将所有数据加载到内存中,但我需要使用scipy kd-tree查看相邻点我在64位Windows XP操作系统上使用Python 2.7 32位。

提前致谢。

编辑:代码发布在下面。我为长计算和变量定义取出了代码。

from liblas import file
import numpy as np

f = file.File(las_file, mode='r')
num_points = int(f.__len__())
dt = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('i', 'u2'), ('c', 'u1'), ('t', 'datetime64[us]')]
xyzict = np.empty(shape=(num_points,), dtype = dt)
counter = 0
for p in f:
    newrow = (p.x, p.y, p.z, p.intensity, p.classification, p.time)
    xyzict[counter] = newrow    
    counter += 1

dropoutList = []
counter = 0
for i in np.nditer(xyzict):
    # code to define P1x, P1y, P1z, P1t
    if counter != 0:
        # code to calculate n, tDiff, and seconds 
        if n > 1 and n < scanN:
            # code to find v and vD
            for d in range(1, int(n-1)):
                # Code to interpolate x, y, z for points between P0 and P1
                # Append tuple of x, y, and z to dropoutList
                dropoutList.append(vD)
    # code to set x, y, z, t for next iteration
    counter += 1

2 个答案:

答案 0 :(得分:4)

无论系统中的RAM数量多少,如果您运行的是32位python,您的应用程序的实际限制大约为2 GB。有关SO的其他一些问题可以解决这个问题(例如,请参阅here)。由于您在ndarray中使用的结构是23个字节,并且您正在读取超过50,000,000个点,因此已经使您大约1 GB。您尚未包含其余代码,因此不清楚程序的其他部分正在消耗多少额外内存。

如果你的系统中有超过2 GB的RAM并且你将继续处理大型数据集,你应该安装64位python以达到约2 GB的限制。

答案 1 :(得分:0)

将点保存在磁盘上的二进制文件中,然后使用numpy.memmap这会慢一点,但可能不会受到影响(取决于算法)。

或尝试64位版本的Python;你可能需要超过2GB的数据。

最后,检查代码如何处理数据。有了这么多元素,就不应该尝试复制/克隆数组。改为使用视图。

如果其他一切都失败了,请尝试64位版本的Linux(因为你不会免费获得64位Windows)。