【问题标题】:What are the workaround options for python out of memory error?python内存不足错误的解决方法是什么?
【发布时间】:2013-11-26 10:20:54
【问题描述】:

我正在将 x,y,z 点文件 (LAS) 读入 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

【问题讨论】:

  • 你能显示给出错误的代码吗? (或者是重现问题的小sn-p?)可能有办法让它更高效,但没有代码就无法判断。
  • 您使用的是np.loadtxt 还是np.genfromtxt?如果是这样,它们对于大文件来说效率很低。 (不要插入我自己的答案,但它是相关的:stackoverflow.com/a/8964779/325565)您可以滚动自己的阅读器并使用fromiter,或者这些天,只使用熊猫。 (Pandas 恰好有一个非常高效的以空格分隔的 ascii 阅读器。)

标签: python numpy scipy out-of-memory


【解决方案1】:

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

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

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

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

【讨论】:

  • 切换到 Linux 应该如何帮助解决 Python 内存不足错误?在这里对 Windows 的挖掘完全是免费的。
  • 我不熟悉将二进制文件读/写到磁盘(我是 python 新手)。
  • 我认为部分文档是指numpy.save():docs.scipy.org/doc/numpy/reference/routines.io.html
  • 听起来linux部分是出于成本考虑。
【解决方案2】:

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

如果您的系统中有超过 2 GB 的 RAM,并且您将继续处理大型数据集,您应该安装 64 位 python 来绕过这个 ~ 2 GB 的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多