簡體   English   中英

如何打開大 (2GB) 文件並更快地進行預計算?

[英]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對象的名稱valueh5py object (數據集或另一組)。

擁有數據集后,有 3 種方法可以訪問相關數據:

  1. 您可以簡單地保存 object 並引用它“好像”它是一個 NumPy 數組。
  2. 您可以保存對象的名稱,然后當您需要對象的數據時,您可以使用數據集名稱和關聯的組進行檢索。
  3. 您可以將數據集值讀入 NumPy 數組。 (這就是您的代碼所做的。)

注意:我更喜歡方法 #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.

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