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

时间:2018-04-17 09:28:40

标签: python large-files

我正在尝试使用

读取我之前在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来自。

1 个答案:

答案 0 :(得分:0)

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

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

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

的原因
np.save(npyname, data)

并在另一个脚本中

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

此方法的另一个优点是:(在我的情况下).npy文件只有.csv文件大小的40%。 :)