[英]Can I store my own class object into hdf5?
我有一個這樣的課:
class C:
def __init__(self, id, user_id, photo):
self.id = id
self.user_id = user_id
self.photo = photo
我需要創建數百萬這些對象。 id是一個整數以及user_id,但是photo是一個大小為64的bool數組。我的老板要我將所有這些存儲在hdf5文件中。 我還需要能夠根據其user_id屬性進行查詢,以獲得具有相同user_id的所有照片。 首先,我如何存儲它們? 甚至可以嗎? 其次,一旦我存儲(如果我可以)他們如何查詢它們? 謝謝。
雖然您可以將整個數據結構存儲在單個HDF5表中,但將所描述的類存儲為三個單獨的變量(兩個一維整數數組和一個用於存儲“照片”屬性的數據結構)可能要容易得多。
如果您關心文件大小和速度而不關心文件的人類可讀性,您可以將64個bool值建模為UINT8的8個1D陣列或UINT8(或CHAR)的2D陣列N x 8。 然后,您可以實現一個簡單的接口,將bool值打包到UINT8的位中並返回(例如, 如何將布爾數組轉換為int數組 )
據了解,HDF5中沒有內置的搜索功能,但您可以讀取包含user_ids
的變量,然后只需使用Python查找與user_id
匹配的所有元素的索引。
獲得索引后,您可以讀入其他變量的相關切片。 HDF5原生支持高效切片,但它適用於范圍,因此您可能想要考慮如何在連續塊中存儲具有相同user_id
記錄,請參閱此處的討論
您可能還想查看pytables - 一個python interace,它構建在hdf5上,用於將數據存儲在類似表格的結構中。
import numpy as np
import h5py
class C:
def __init__(self, id, user_id, photo):
self.id = id
self.user_id = user_id
self.photo = photo
def write_records(records, file_out):
f = h5py.File(file_out, "w")
dset_id = f.create_dataset("id", (1000000,), dtype='i')
dset_user_id = f.create_dataset("user_id", (1000000,), dtype='i')
dset_photo = f.create_dataset("photo", (1000000,8), dtype='u8')
dset_id[0:len(records)] = [r.id for r in records]
dset_user_id[0:len(records)] = [r.user_id for r in records]
dset_photo[0:len(records)] = [np.packbits(np.array(r.photo, dtype='bool').astype(int)) for r in records]
f.close()
def read_records_by_id(file_in, record_id):
f = h5py.File(file_in, "r")
dset_id = f["id"]
data = dset_id[0:2]
res = []
for idx in np.where(data == record_id)[0]:
record = C(f["id"][idx:idx+1][0], f["user_id"][idx:idx+1][0], np.unpackbits( np.array(f["photo"][idx:idx+1][0], dtype='uint8') ).astype(bool))
res.append(record)
return res
m = [ True, False, True, True, False, True, True, True]
m = m+m+m+m+m+m+m+m
records = [C(1, 3, m), C(34, 53, m)]
# Write records to file
write_records(records, "mytestfile.h5")
# Read record from file
res = read_records_by_id("mytestfile.h5", 34)
print res[0].id
print res[0].user_id
print res[0].photo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.