我目前有一百万行数据集,每个数据集大约有10000列(可变长度)。在Python中向HDF5文件写入大量数字
现在我想将这些数据写入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 RAM,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的概念不太了解。:)非常感谢!
是的,迭代并将单个数字写入文件(甚至写入内存numpy数组)很慢。为了提高速度,您希望使用更大的块,数千个数字。 – hpaulj
@hpaulj感谢您的单挑。你能详细说明一下吗?我该如何处理可变长度?我的直觉告诉我只需将列填充到最大的对应列,然后使用我的问题中的第二个代码块插入数字。这是解决这个问题的好方法吗? –
我没有看到使用可变长度的演示代码中的任何内容。你所要做的就是按数组或行的方式将数组写入文件。 – hpaulj