[英]How can I open large (2GB) files and precompute it quicker?
這是我目前用來打開這個非常大的 matlab 文件的代碼:
self.data = {}
f = h5py.File(filepath, 'r')
for k, v in f.items():
self.data[k] = np.array(v)
self.data = list(self.data.items())
self.data = np.array(self.data)
self.fs = self.data[1][1][0][0]
self.data = self.data[0][1]
print('fs = ', self.fs)
print('DONE. Data read using h5py reader')
完全加載大約需要 3-5 分鍾。 如何改進此代碼以便加快進程?
保存和使用對象很容易。 在不知道代碼用途的情況下,很難提供有關對象與 arrays 的詳細信息。 拿到變量self.data
后你想做什么? 您檢索所有數據集,然后繼續重新定義self.data
。 最后,將self.data
分配給第一個數據集的數組。 此外, self.fs
指向第二個數據集中的單個值。 因此,尚不清楚為什么要檢索所有這些。
如果你只想要第一個數據集中的數據,這樣的事情就可以完成。
f = h5py.File(filepath, 'r')
# returns first key from group member names:
dsname = next(iter(f)) # (name of 1st dataset)
self.data = f[dsname][:] # (data from 1st dataset)
如果您想要所有數據集中的名稱和數據,這將返回名稱和對象的字典。
f = h5py.File(filepath, 'r')
for k, v in f.items():
self.data[k] = v
然后,當您需要數據數組時,請使用以下方法之一:
arr = data['a dataset name'][:] # for 1 dataset (when you know the name)
for dsname, obj in data.items(): # loop thru all pairs in data
arr = obj[:] # or
arr = f[dsname][:]
要了解發生了什么,讓我們從一些 HDF5 基礎知識開始。 使用 HDF5 時,了解架構至關重要。 數據結構類似於計算機上的文件夾和文件。 文件夾是“組”,文件是“數據集”。 使用 h5py,您可以使用字典語法訪問組成員,並使用 NumPy 數組語法訪問數據集。 (h5py 文件 object 的行為類似於組。)
因此,當您for k,v in f.items()
,h5py 會為每個組成員(代碼中的k,v
)返回key,value
對。 key
是對象的名稱, value
是h5py object (數據集或另一組)。
擁有數據集后,有 3 種方法可以訪問相關數據:
注意:我更喜歡方法 #1 和 #2,因為它們不會將數據加載到 memory 中,直到您讀取數據。
這是您的代碼以及我對每個步驟的評論:
# returns a file object "f" (behaves like a group):
f = h5py.File(filepath, 'r')
# returns key/value pairs of group member names/objects:
for k, v in f.items():
# adds a dictionary key (object name) with value of an array read from object "v":
self.data[k] = np.array(v)
# converts the (name,array) dictionary into a list:
self.data = list(self.data.items())
# converts the list into a nd.array of dtype=object:
# -has 1 row for each dataset with 2 columns:
# -column 0: object name, column 1: array of data
self.data = np.array(self.data)
# reads [0][0] value from array at self.data[1][1] ([0][0] value for 2nd dataset)
self.fs = self.data[1][1][0][0]
# resets data to value from array at self.data[0][1] (array for 1st dataset)
self.data = self.data[0][1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.