我目前有一个包含一百万行和每列大约 10000 列(可变长度)的数据集。
现在我想将此数据写入 HDF5 文件,以便以后使用。我得到了这个工作,但它非常慢。即使是 1000 个值也需要几分钟才能存储在 HDF5 文件中。
我一直在到处寻找,包括 SO 和 H5Py 文档,但我真的找不到任何描述我的用例的东西,但我知道可以做到。
下面我制作了一个演示源代码,描述了我现在正在做的事情:
import h5py
import numpy as np
# I am using just random values here
# I know I can use h5py broadcasts and I have seen it being used before.
# But the issue I have is that I need to save around a million rows with each 10000 values
# so I can't keep the entire array in memory.
random_ints = np.random.random(size = (5000,10000))
# See http://stackoverflow.com/a/36902906/3991199 for "libver='latest'"
with h5py.File('my.data.hdf5', "w", libver='latest') as f:
X = f.create_dataset("X", (5000,10000))
for i1 in range(0, 5000):
for i2 in range(0, 10000):
X[i1,i2] = random_ints[i1,i2]
if i1 != 0 and i1 % 1000 == 0:
print "Done %d values..." % i1
该数据来自数据库,它不是源代码中所见的预先生成的 np 数组。
如果您运行此代码,您会看到它需要很长时间才能打印出“完成 1000 个值”。
我在一台具有 8GB 内存、Ubuntu 16.04 LTS 和 Intel Core M(其性能类似于 Core i5)和 SSD 的笔记本电脑上,它必须足以比这更快一点。
我在这里阅读了有关广播的信息:http: //docs.h5py.org/en/latest/high/dataset.html
当我这样使用它时:
for i1 in range(0, 5000):
X[i1,:] = random_ints[i1]
它已经快了一个数量级(完成只需几秒钟)。但我不知道如何让它与可变长度数据集一起使用(列是可变长度的)。很高兴能对如何做到这一点有所了解,因为我认为我现在对 HDF5 的概念没有一个好主意:) 非常感谢!