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

Python 将大ascii文件读入numpy数组的最快方法,python,arrays,numpy,file-io,text-files,Python,Arrays,Numpy,File Io,Text Files,我有一个大小为1505MB的文本文件,其中包含浮点数据。该文件大约有73000行和1500列。我想将文件内容读入numpy数组,然后对数组执行一些分析,但我的机器一直在使用numpy.readtxt读取文件,速度变慢。使用python将此文件读入数组的最快方法是什么 以下函数分配读取文本文件所需的适当内存量 def read_large_txt(path, delimiter=None, dtype=None): with open(path) as f: nrows =

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

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

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.loadtxt
np.genfromtxt
中的一些额外参数,例如
skiprows
usecols

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

您还可以使用经过优化的读卡器:

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

你说“慢慢来”。我们在这里说话有多慢?你使用了多少内存?是一个稀疏矩阵吗?@user2357112我的机器上有四个cpu,它们都达到了4%到100%的性能,基本上我不能用我的机器做任何其他事情。检查(使用pandas.read_csv和空格作为分隔符)@ChrisP该文件包含大约73000个对象的概率分布。我不知道它有多稀疏?!!数据类型没有强制转换
line.split
返回一个字符串数组,因此您需要先将其转换为一个1D numpy数组的数据类型。@Evert相信我,它是有效的。可能NumPy在将值分配给数组时正在进行转换,从某种意义上说,这让我非常害怕:它会崩溃吗?什么时候(在什么条件下)会崩溃?这种行为在什么地方被记录下来了吗?@Evert@Dalek:修改这个函数来忽略这些行应该不会太难,对吧?