簡體   English   中英

我可以將自己的類對象存儲到hdf5中嗎?

[英]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記錄,請參閱此處的討論

h5py:切片陣列數據集的正確方法

您可能還想查看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM