[英]Nested Iteration of HDF5 using PyTables
我有一個相當大的數據集,存儲在HDF5中,可以使用PyTables訪問。 我需要對此數據集執行的一個操作是每個元素之間的成對比較。 這需要2個循環,一個循環遍歷每個元素,一個內部循環遍歷每個其他元素。 因此,該操作着眼於N(N-1)/ 2個比較。
對於相當小的集合,我發現將內容轉儲到多維numpy數組中然后進行迭代會更快。 由於內存問題,我遇到了大型集合的問題,需要在運行時訪問數據集的每個元素。
將元素放入數組可以每秒獲得約600次比較,而對hdf5數據本身進行操作則可以每秒獲得約300次比較。
有沒有辦法加快這個過程?
示例如下(這不是我的真實代碼,只是一個示例):
小套裝 :
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
elements = np.empty((N_elements, 1e5))
for ii, d in enumerate(data):
elements[ii] = data['element']
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(elements[ii], elements[jj])
大套 :
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(data['element'][ii], data['element'][jj])
我在這里建議兩種方法:
numpy memmap:創建一個內存映射數組,將數據放入其中,然后運行“ Small Set”的代碼。 內存映射的行為幾乎類似於數組。
使用multiprocessing-module允許並行處理:如果“比較”方法至少消耗了明顯的CPU時間,則可以使用多個進程。
假設您的CPU中有多個內核,則速度將大大提高。 采用
選擇方式之前:“了解敵人”,即使用剖析! 只有在瓶頸處有所改善,優化才值得付出努力,因此,首先要找出哪些方法會浪費您寶貴的CPU時間。
您的算法為O(n ^ 2),對大數據不利。 您是否沒有機會通過應用某些邏輯來減少這種情況? 這始終是最好的方法。
問候,
索斯滕
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.