将大型ascii文件读入numpy数组的最快方法

时间:2016-04-05 00:08:14

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

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

2 个答案:

答案 0 :(得分:4)

您还可以使用经过优化的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

答案 1 :(得分: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