【问题标题】:python read zipfile into numpy-array efficientlypython有效地将zipfile读入numpy-array
【发布时间】:2017-05-03 22:32:48
【问题描述】:

我想将一个 zipfile 读入内存并将其内容提取到一个 numpy 数组中(作为 numpy-datatypes)。这需要以极其有效/快速的方式发生,因为文件相当大而且数量很多。不幸的是,查看类似问题对我没有帮助,因为我在阅读时找不到将数据转换为 numpy-datatypes 的方法。事实证明,速度也是个大问题。

例如:zipfile“log_ks818.zip”包含“log_file.csv”,其中包含以下格式的所需数据(yyyymmdd hhnnsszzz,float,float,zero):

20161001 190000100,1.000500,1.000800,0
20161001 190001000,1.001000,1.002000,0
20161001 190002500,1.001500,1.001200,0
...

迄今为止我做到的最快速度(使用 pandas):

zfile = zipfile.ZipFile("log_ks818.zip", 'r')
df = pd.read_csv(io.BytesIO(zfile.read("log_file.csv")), header=None, usecols=[0, 1, 2], delimiter=',', encoding='utf-8')
print(df.head())

但是,对于文件中的约 2,000,000 行(解压后约 80MB),这需要大约 6 秒,这太慢了(而且它不是一个 numpy 对象)。当我比较不同 numpy/pandas-methods 的读取速度时,使用硬盘驱动器上提取的文件进行测试,np.fromfile 以 0.08 秒的速度表现最佳,只需将其放入内存。如果在从 zip 文件中读取数据时可以保持在这个量级,那就太好了。

【问题讨论】:

  • 您是否在第一次测试后清除缓存?因为如果不是,您的后续测试并不能真正衡量从磁盘读取文件。
  • 我想是的。如果我从头开始只执行 np.fromfile/zfile-test 的脚本,我每次都会得到 0.08 秒和 6 秒。我不确定缓存会发生在哪里。
  • 对于加载 csv 文件,pandas 阅读器应该是最快的。 Numpy 加载程序逐行读取文件并从中构建列表列表。我不认为拉链部分有什么不同。
  • 文件系统缓存,这就是。同意@hpaulj 的观点,pandas csv 阅读器是将类似 csv 的内容引入 python 的最快方法之一。
  • @P.Zeek,您可以通过子进程在 shell 中 zcat 小瓶并将该流传输到 pandas,可能会更快。考虑将文件从 bandas 存储到 bcolz --> 更好

标签: python arrays performance numpy zipfile


【解决方案1】:

我认为这不是磁盘读取速度的问题。即使您使用的是 HDD,也可以在一秒钟内将 80MB 读入内存。

以我的经验为例,时间成本是由解压过程决定的。如果您只使用提取的数据,我相信它不会花费您太多。

【讨论】:

  • 解压后的文件 (80MB) 需要比 zip 文件 (2.6MB) 多 30 倍的空间,因为 csv 文件的内容有时是多余的,因此可以轻松压缩。这就是为什么我试图只在内存中按需提取所需的文件。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2018-04-03
相关资源
最近更新 更多