Python MemoryError:无法分配数组内存

2023-12-21

我有一个 250 MB 的 CSV 文件,需要读取大约 7000 行和大约 9000 列。每行代表一幅图像,每列代表一个像素(灰度值0-255)

我从一个简单的开始np.loadtxt("data/training_nohead.csv",delimiter=",")但这给了我一个记忆错误。我觉得这很奇怪,因为我运行的是 64 位 Python,安装了 8 GB 内存,但它在仅使用大约 512 MB 后就死掉了。

此后我尝试了其他几种策略,包括:

  1. import fileinput一次读取一行,将它们附加到数组中
  2. np.fromstring读入整个文件后
  3. np.genfromtext
  4. 手动解析文件(由于所有数据都是整数,因此编码相当容易)

每种方法都给了我相同的结果。内存错误大约 512 MB。想知道 512MB 是否有什么特别之处,我创建了一个简单的测试程序,它填满了内存,直到 python 崩溃:

str = " " * 511000000 # Start at 511 MB
while 1:
    str = str + " " * 1000 # Add 1 KB at a time

这样做直到大约 1 场演出才崩溃。我也只是为了好玩,尝试过:str = " " * 2048000000(填补 2 场演出)- 运行顺利。填满内存并且从不抱怨。所以问题不在于我可以分配的 RAM 总量,而在于我可以分配内存多少次......

我用谷歌搜索毫无结果,直到我找到了这篇文章:Python 在大型 CSV 文件上内存不足 (numpy) https://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy

我准确地复制了答案中的代码:

def iter_loadtxt(filename, delimiter=',', skiprows=0, dtype=float):
    def iter_func():
        with open(filename, 'r') as infile:
            for _ in range(skiprows):
                next(infile)
            for line in infile:
                line = line.rstrip().split(delimiter)
                for item in line:
                    yield dtype(item)
        iter_loadtxt.rowlength = len(line)

    data = np.fromiter(iter_func(), dtype=dtype)
    data = data.reshape((-1, iter_loadtxt.rowlength))
    return data

Calling iter_loadtxt("data/training_nohead.csv")这次给出了一个略有不同的错误:

MemoryError: cannot allocate array memory

谷歌搜索这个错误我只发现了一个,不是很有帮助,帖子:创建布尔 NumPy 数组 (Python) 时出现内存错误 (MemoryError) https://stackoverflow.com/questions/3717418/memory-error-memoryerror-when-creating-a-boolean-numpy-array-python

由于我运行的是 Python 2.7,所以这不是我的问题。任何帮助,将不胜感激。


在@J.F. 的帮助下塞巴斯蒂安我给出了以下答案:

train = np.empty([7049,9246])
row = 0
for line in open("data/training_nohead.csv")
    train[row] = np.fromstring(line, sep=",")
    row += 1

当然,这个答案假设事先知道行数和列数。如果您事先没有这些信息,则行数总是需要一段时间才能计算,因为您必须读取整个文件并计算行数\n人物。像这样的东西就足够了:

num_rows = 0
for line in open("data/training_nohead.csv")
    num_rows += 1

对于列数,如果每行具有相同的列数,那么您可以只计算第一行,否则您需要跟踪最大值。

num_rows = 0
max_cols = 0
for line in open("data/training_nohead.csv")
    num_rows += 1
    tmp = line.split(",")
    if len(tmp) > max_cols:
        max_cols = len(tmp)

该解决方案最适合数字数据,因为包含逗号的字符串确实会使事情变得复杂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python MemoryError:无法分配数组内存 的相关文章

随机推荐