PyTables學習 (資料儲存形式,物件樹結構)

2022-09-07 04:39:09 字數 4536 閱讀 4992

參考自

pytables的主要目的是提供乙個好的操作hdf5檔案的方法。

hdf檔案是分層資料格式(hierarchical data format

)的簡稱。資料主要由組(groups)和資料集(datasets)組成。其中,組的作用類似於資料夾,用於包含資料集或者其他組。組之間層層包含,構成了分層次的結構。由於hdf5檔案具有分層儲存的特點,可以儲存元資料,支援多種壓縮模式,具有即時壓縮的特點。因此hdf5檔案非常適合儲存大容量,包含元資訊的科學資料。

在pytables中的資料集主要有兩種形式: 表(tables)和陣列(array)。

其中,表是由結構相同的記錄(records)組成。記錄儲存了不同的字段(fields),每個欄位的儲存的變數的資料型別是相同的。在hdf5的術語中,表中的記錄也被稱為復合資料型別。

比如,宣告乙個類(class),包含命名的字段和型別資訊:

class

particle(isdescription):

name = stringcol(16) #

16-character string

idnumber = int64col() #

signed 64-bit integer

adccount = uint16col() #

unsigned short integer

tdccount = uint8col() #

unsigned byte

grid_i = int32col() #

integer

grid_j = int32col() #

integer

#a sub-structure (nested data-type)

class

properties(isdescription):

pressure = float32col(shape=(2,3)) #

2-d float array (single-precision)

energy = float64col(shape=(2,3,4)) #

3-d float array (double-precision)

之後,就可以基於這個類構造表,然後向其中寫資料並儲存。

另乙個重要的是陣列,他類似於表,但不同之處在於其中所有的元件都是同構的。它們有不同的特點,比如泛型,可擴充套件,可變長度。

pytables具有如下優點:python所具備的物件導向和可內省,hdf5強大的資料管理功能,numpy的靈活性,以及numexpr對大規模網格物件資料的操作能力。具有以下特性:

pytables可以在乙個樹狀結構中管理表和陣列。為了實現這個功能,pytables動態地建立了物件樹的結構,從而模擬hdf5在磁碟中的儲存方式。通過遍歷動態樹實現對hdf5物件的讀取。通過檢查節點的元資料(metadata),可以了解物件中儲存了什麼格式的資料。

在物件樹中不同的節點,是pytables類中的實體。有幾種類,但最重要的類是結點(node),組(group)和葉(leaf)類。pytables樹中所有的節點(nodes)都是結點(node)類的實體。組和葉都是node類的子類。組實體是包含了0個或更多個葉節點的組結構。葉實體是不再包含其他組或葉,只包含實際資料的容器。表(table),陣列(array),carray,earray,vlarray,以及未定(unimplemented)類則是葉的子類。

對組和葉進行操作類似於在unix檔案系統中對資料夾和檔案進行操作。在 pytables 中,物件樹中的物件通常通過完整(絕對)路徑名來引用。此完整路徑可以指定為字串(例如 '/subgroup2/table3',使用"/"作分隔符),或者以自然命名訪問(例如file.root.subgroup2.table3)。

並非檔案中的所有資料都載入到物件樹中。元資料(即,描述實際資料結構的特殊資料)僅在使用者希望訪問時才載入。此外,實際資料直到使用者請求時才讀取。使用物件樹(元資料),您可以檢索有關磁碟上物件的資訊,例如表名、標題、列名、列中的資料型別、行數,組的形狀、型別碼等。您還可以在樹中搜尋特定型別的資料,然後讀取並處理這些資料。

值得注意的是,pytables採用了元資料快取系統,該系統延遲載入節點(即按需載入),並解除安裝一段時間未使用的節點。需要強調的是,節點在未被引用之後進入快取,並且可以直接從快取中恢復,而無需從磁碟執行反序列化過程。此功能允許以低記憶體消耗快速處理具有大型層次結構的檔案,同時保留以前實現的物件樹的所有強大瀏覽功能。

為了更好地理解這個物件樹實體的動態特性,讓我們從乙個示例pytables指令碼(可以在examples/objecttree.py中找到)開始建立乙個hdf5檔案:

import

tables as tb

class

particle(tb.isdescription):

identity = tb.stringcol(itemsize=22, dflt="

", pos=0) #

character string

idnumber = tb.int16col(dflt=1, pos = 1) #

short integer

speed = tb.float32col(dflt=1, pos = 2) #

single-precision

#以寫模式開啟乙個檔案

fileh = tb.open_file("

objecttree.h5

", mode = "w"

)#得到hdf5根組

root =fileh.root

#建立組

group1 = fileh.create_group(root, "

group1")

group2 = fileh.create_group(root, "

group2")

#在根組中建立陣列1

array1 = fileh.create_array(root, "

array1

", ["

string

", "

array

"], "

string array")

#分別在組1,2中建立表1,2

table1 = fileh.create_table(group1, "

table1

", particle)

table2 = fileh.create_table("

/group2

", "

table2

", particle)

#在組1中建立最後乙個表

array2 = fileh.create_array("

/group1

", "

array2

", [1,2,3,4])

#填充**

for table in

(table1, table2):

#get the record object associated with the table:

row =table.row

#fill the table with 10 records

for i in range(10):

#first, assign the values to the particle record

row['

identity

'] = f'

this is particle:

'row[

'idnumber

'] =i

row[

'speed

'] = i * 2.

#this injects the record values

#flush the table buffers

table.flush()

#finally, close the file (this also will flush all the remaining buffers!)

fileh.close()

這個小程式建立了乙個名為 objecttree.h5 的 hdf5 檔案,其結構如圖 所示。建立檔案時,物件樹中的元資料會在記憶體中更新,而實際資料會儲存到磁碟。當您關閉檔案時,物件樹不再可用。但是,當您重新開啟此檔案時,物件樹將根據磁碟上的元資料在記憶體中重建(這是以惰性方式完成的,以便僅載入使用者所需的物件),從而允許您使用它與最初建立它時的方式完全相同。

圖 1:具有 2 個子組、2 個表和 1 個陣列的 hdf5 示例。

在圖 2 中,您可以看到讀取上述 objecttree.h5 檔案時建立的物件樹示例(實際上,讀取任何受支援的通用 hdf5 檔案時總是會建立這樣的物件樹)。花點時間理解它是值得的,它將幫助您理解記憶體中 pytables 物件的關係。

圖 2:pytables 物件樹示例。

plist 儲存資料學習

載入plist的資料 特別重要的類 nsbundle 乙個nsbundle對應乙個資料夾 利用nsbundle就能訪問手機裡面的任何資源 1 得到對應所有資源的bundle nsbundle bundle nsbundle mainbundle 2 通過bundle得到對應資源的全路徑 nsstri...

python學習之儲存資料

使用模組json來儲存儲存使用者資料。儲存dump,載入load 1.使用json.dump 和json.load 編寫乙個儲存一組數字的程式 儲存資料 import json 匯入模組 numbers 1,2,3,4,5,6 建立數字列表 filename numbers.json 生成檔案,js...

Android 學習筆記14 資料儲存

android的資料儲存有4中方式 sharedpreferences sqlite content provider和file sharepreferences 提供輕量型資料儲存,一般使用者儲存配置資訊 本質上是xml檔案上的鍵值對,通常用來儲存一些簡單的配置資訊。其儲存位置在 data dat...