【问题标题】:Why is reading large files in python so slow?为什么在python中读取大文件这么慢?
【发布时间】:2018-09-27 04:58:37
【问题描述】:

我正在尝试使用

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

【问题讨论】:

  • 也许我应该补充说我正在使用 if ii%2 == 0: 因为否则我会尝试将空行传递给输出矩阵
  • 内存够吗?
  • 从读取时间中提取初始化,确保它与文件大小有关。如果 nrows 很大,它可以使用交换
  • 是的,我有 120 GB RAM。它确实读取了整个文件,我只是想知道是否有办法更快地做到这一点。
  • 也许 split 在 Java 中的实现很糟糕(导致大量字符串分配),请尝试使用 csv 阅读器

标签: python large-files


【解决方案1】:

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

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

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

np.save(npyname, data)

在另一个脚本中

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

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

【讨论】:

  • 如果您有更大的数据,我建议您也查找 HDF5。它具有本机压缩功能,最重要的是,可以跨语言访问。
  • @jpp HDF5会进一步提高加载速度吗?
  • 对于 数据(比如 1GB+),如果您选择正确的选项,根据我的经验,是的。
  • 那么可能值得一试。我的文件有 4GB+ 的 npy 和 10 GB+ 的 csv。
  • @jpp 我检查了。老实说,我无法提高加载速度。可能我已经处于机器限制(4-6 秒内的 4 GB 已经大约 1 GB/秒)。无论如何,使用 gzip 压缩(compression_opts 9)我可以稍微减小文件大小(3.7 GB 而不是 4 GB),但我的数据是非常随机的,因此使用其他数据结构可能会更好。但是,使用这种压缩,写入硬盘驱动器需要更长的时间。现在我可能会继续使用 .npy 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2018-10-08
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多