【发布时间】: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