Python内存不足错误的解决方法有哪些替代选项?

5
我正在将一个x,y,z点文件(LAS)读入Python,并遇到了内存错误。 我正在为我正在开展的项目在已知点之间插值未知点。 我开始使用小文件(< 5,000,000个点)进行工作,并且能够轻松读取/写入numpy数组和Python列表。 我收到了更多数据要处理(> 50,000,000个点),现在我的代码因MemoryError而失败。
如何处理这么大量的数据? 我不必一次加载所有数据到内存中,但我需要使用scipy kd-tree查看相邻点。 我使用Python 2.7 32位在64位Windows XP操作系统上。
提前致谢。
编辑:下面发布了代码。 我删除了长时间计算和变量定义的代码。
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

你能展示一下出错的代码吗?(或者一个小片段来重现这个问题?)也许有一种方法可以使它更有效率,但是没有代码是不可能知道的。 - David Robinson
1
你是否正在使用np.loadtxtnp.genfromtxt?如果是的话,它们对于大文件来说相当低效。(不是为了推销我的答案,但这很相关:https://dev59.com/nGox5IYBdhLWcg3wzXel#8964779)你可以编写自己的读取器并使用`fromiter`,或者现在可以直接使用pandas。(Pandas恰好有一个非常高效的空格分隔ascii读取器。) - Joe Kington
2个回答

7
无论您的系统中有多少RAM,如果您正在运行32位Python,则您的应用程序实际上最多只能使用约2 GB的RAM。关于这个问题,SO上有许多其他问题进行了讨论(例如,请参见此处)。既然您在ndarray中使用的结构是23个字节,并且您正在读取超过5000万个点,那么这已经消耗了约1GB的内存。由于您没有包含其余代码,因此不清楚程序的其他部分会消耗多少额外的内存。
如果您的系统RAM远远超过2GB,并且您将继续处理大型数据集,则应安装64位Python以避免此约2GB的限制。

2

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

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

最后,请检查您的代码如何处理数据。对于这么多元素,您不应该尝试复制/克隆数组。改用视图。

如果其他所有方法都失败了,请尝试64位版本的Linux(因为您不会免费获得64位Windows)。


6
转换到Linux操作系统能够如何解决Python内存溢出错误?这里对Windows的批评完全是没有必要的。 - John Y
我不熟悉读/写二进制文件到磁盘上(我在Python方面很新手)。 - Barbarossa
我认为文档的一部分是指 numpy.save():http://docs.scipy.org/doc/numpy/reference/routines.io.html - Aaron Digulla
3
这句话的意思是选择 Linux 是出于成本考虑。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接