我目前有一百萬行數據集,每個數據集大約有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