代码之家  ›  专栏  ›  技术社区  ›  Redshoe

当执行numpy.genfromtxt()时,python是否会读取文件的所有行?

  •  1
  • Redshoe  · 技术社区  · 4 月前

    我有一个非常大的ASCII文件(6300万行或更多),我想用它来读取 numpy.genfromtxt() 但是,它占用了太多的内存。我想知道python在什么时候会做什么 numpy.genfromtxt() 被执行。它能一次读完所有的行吗?

    例如,看看下面的代码。

    import numpy as np
    data = np.genfromtxt("large.file.txt")
    

    当我执行上面的代码时,python会读取其中的所有内容吗 large.file.txt 并将其加载到内存中?如果是,是否有另一种逐行读取大文件的方法,这样python就不会使用大内存?

    1 回复  |  直到 4 月前
        1
  •  1
  •   user2357112    4 月前

    它读所有的行。必须如此 data 数组必须保存文件的所有数据,NumPy无法在不读取所有文件的情况下构建包含所有文件数据的数组。

    也就是说,实现使用的内存比输出所需的内存多得多。实施情况 parses 在应用进一步处理之前,将文件数据的请求列放入元组列表中,元组列表比NumPy数组占用更多的内存。

    如果你想用更少的中间存储器,我 认为 numpy.loadtxt 在这方面效率更高——深入研究实施最终会发现 function 它将解析后的数据直接存储到数组中,而不是使用元组列表。 numpy.loadtxt 没有那么灵活 numpy.genfromtxt ,但你似乎不需要额外的灵活性。

    这不会让 数据 不过,它本身占用的内存更少。也, numpy.loadtxt 仍然需要额外的中间存储器。它应该比中间内存少 numpy.genfromtxt .

        2
  •  0
  •   hpaulj    4 月前

    据我所知 genfromtxt 源代码,它设置了一个打开的文件句柄, fhd .

    然后使用 next(fhd) 跳过开头的行。

    主阅读器块是

        # Parse each line
        for (i, line) in enumerate(itertools.chain([first_line, ], fhd)):
            values = split_line(line)
            nbvalues = len(values)
            # Skip an empty line
            if nbvalues == 0:
                continue
            if usecols:
                try:
                    values = [values[_] for _ in usecols]
                except IndexError:
                    append_to_invalid((i + skip_header + 1, nbvalues))
                    continue
            elif nbvalues != nbcols:
                append_to_invalid((i + skip_header + 1, nbvalues))
                continue
            # Store the values
            append_to_rows(tuple(values))
            ...