【问题标题】:fastest approach to read a big ascii file into a numpy array将大 ascii 文件读入 numpy 数组的最快方法
【发布时间】:2016-04-05 00:08:13
【问题描述】:

我有一个 1505MB 大小的文本文件,其中包含浮点数据。该文件有大约 73000 行和 1500 列。我想将文件的内容读入numpy 数组,然后对数组执行一些分析,但是我的机器使用numpy.readtxt 读取文件变得很慢。使用python将此文件读入数组的最快方法是什么?

【问题讨论】:

  • 你说“越来越慢”。我们在这里说话有多慢?您使用了多少内存?
  • 是稀疏矩阵吗?
  • @user2357112 我的机器上有四个 cpu,它们的性能都达到了 4% 到 100%,基本上我不能用我的机器做其他事情。
  • 检查stackoverflow.com/questions/15096269/…(使用pandas.read_csv,空格作为分隔符)
  • @ChrisP 该文件包含大约 73000 个对象的概率分布。不知道有多稀少?!!

标签: python arrays numpy file-io text-files


【解决方案1】:

您也可以使用pandas阅读器,已优化:

In [3]: savetxt('data.txt',rand(10000,100))

In [4]: %time u=loadtxt('data.txt')
Wall time: 7.21 s

In [5]: %time u= read_large_txt('data.txt',' ')
Wall time: 3.45 s

In [6]: %time u=pd.read_csv('data.txt',' ',header=None).values
Wall time: 1.41 s

【讨论】:

    【解决方案2】:

    以下函数分配读取文本文件所需的适当内存量。

    def read_large_txt(path, delimiter=None, dtype=None):
        with open(path) as f:
            nrows = sum(1 for line in f)
            f.seek(0)
            ncols = len(f.next().split(delimiter))
            out = np.empty((nrows, ncols), dtype=dtype)
            f.seek(0)
            for i, line in enumerate(f):
                out[i] = line.split(delimiter)
        return out
    

    它通过预先知道行数、列数和数据类型来分配内存。您可以轻松添加在np.loadtxtnp.genfromtxt 中找到的一些额外参数,例如skiprowsusecols 等等。

    重要:

    正如@Evert 所观察到的,out[i] = line.split(delimiter) 似乎是错误的,但 NumPy 将字符串转换为 dtype,而无需在此处额外处理数据类型。 There are some limits though.

    【讨论】:

    • 数据类型没有强制转换。 line.split 返回一个字符串数组,因此您需要先将其转换为 dtype 的一维 numpy 数组。
    • @Evert 相信我,它有效。 NumPy 可能在将值分配给数组时进行转换
    • 从某种意义上说,这把我吓坏了:它会坏掉吗,什么时候(在什么条件下)?这种行为是否记录在某处?
    • @Dalek:修改该函数以忽略这些行应该不会太难,对吧?
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2022-01-09
    • 2014-04-17
    相关资源
    最近更新 更多