为什么读取 python 中的大文件这么慢?

Why is reading large files in python so slow?

我正在尝试使用

读取我之前在 python 中创建的 csv 文件
with open(csvname, 'w') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',')
    csvwriter.writerows(data)

数据是一个包含大约 30k * 30k 条目的随机矩阵,np.float32 格式。总共约 10 GB 文件大小。

一旦我使用此函数读入文件(因为我已经知道我的矩阵的大小并且 np.genfromtxt 非常慢并且此时需要大约 100 GB RAM)

def read_large_txt(path, delimiter=',', dtype=np.float32, nrows = 0):
    t1 = time.time()
    with open(path, 'r') as f:
        out = np.empty((nrows, nrows), dtype=dtype)
        for (ii, line) in enumerate(f):
            if ii%2 == 0:
                out[int(ii/2)] = line.split(delimiter)
    print('Reading %s took %.3f s' %(path, time.time() - t1))
return out

阅读该文件大约需要 10 分钟。我使用的硬盘驱动器应该能够读取大约 100 MB/s,这将使读取时间减少到大约 1-2 分钟。

知道我做错了什么吗?

相关:why numpy narray read from file consumes so much memory? 这就是函数 read_large_txt 的来源。

我找到了一个非常简单的解决方案。由于我也在创建这些文件,因此我不需要将它们另存为 .csv 文件。将它们加载为 .npy 文件的方式(!)更快:

加载(包括用“,”分隔每一行)存储为 .csv 的 30k * 30k 矩阵大约需要 10 分钟。对存储为 .npy 的矩阵执行相同操作大约需要 10 秒!

这就是为什么我必须将上面写的代码更改为:

np.save(npyname, data)

并在另一个脚本中

out = np.load(npyname + '.npy')

此方法的另一个优点是:(在我的例子中).npy 文件的大小只有 .csv 文件的大约 40%。 :)