numpy Loadtxt函数似乎消耗了太多内存

Ian*_*ore 5 python numpy out-of-memory

当我使用numpy.loadtxt加载数组时,它似乎占用了太多内存.例如

a = numpy.zeros(int(1e6))
Run Code Online (Sandbox Code Playgroud)

导致内存增加约8MB(使用htop,或仅8bytes*1百万\大约8MB).另一方面,如果我保存然后加载此数组

numpy.savetxt('a.csv', a)
b = numpy.loadtxt('a.csv')
Run Code Online (Sandbox Code Playgroud)

我的内存使用量增加了大约100MB!我再次用htop观察到了这一点.这是在iPython shell中观察到的,也是在使用Pdb ++逐步执行代码时观察到的.

知道这里发生了什么吗?

在阅读了jozzas的回答之后,我意识到如果我提前知道数组大小,那么如果说"a"是一个mxn数组,则有更多内存有效的方法:

b = numpy.zeros((m,n))
with open('a.csv', 'r') as f:
    reader = csv.reader(f)
    for i, row in enumerate(reader):
        b[i,:] = numpy.array(row)
Run Code Online (Sandbox Code Playgroud)

Joh*_*yon 5

将此浮点数组保存到文本文件会创建一个24M文本文件.当你重新加载它时,numpy逐行遍历文件,解析文本并重新创建对象.

我希望在这段时间内内存使用量会出现峰值,因为numpy不知道结果数组在到达文件末尾之前需要多大,所以我希望至少有24M + 8M +其他使用临时内存.

这是numpy代码的相关位,来自/lib/npyio.py:

    # Parse each line, including the first
    for i, line in enumerate(itertools.chain([first_line], fh)):
        vals = split_line(line)
        if len(vals) == 0:
            continue
        if usecols:
            vals = [vals[i] for i in usecols]
        # Convert each value according to its column and store
        items = [conv(val) for (conv, val) in zip(converters, vals)]
        # Then pack it according to the dtype's nesting
        items = pack_items(items, packing)
        X.append(items)

    #...A bit further on
    X = np.array(X, dtype)
Run Code Online (Sandbox Code Playgroud)

这个额外的内存使用不应该是一个问题,因为这只是python的工作方式 - 而你的python进程似乎使用100M的内存,在内部它保持知道哪些项不再使用,并将重用记忆.例如,如果要在一个程序中重新运行此保存加载过程(保存,加载,保存,加载),则内存使用量不会增加到200M.

  • 只要每个单独的文本文件小于您可用的物理内存量,就可以使用numpy的loadtxt.即使文件较大,它仍应设法加载它.我建议不要滚动你自己的版本,直到使用numpy失败. (2认同)