簡體   English   中英

使用PyTables進行HDF5的嵌套迭代

[英]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])

我在這里建議兩種方法:

  1. numpy memmap:創建一個內存映射數組,將數據放入其中,然后運行“ Small Set”的代碼。 內存映射的行為幾乎類似於數組。

  2. 使用multiprocessing-module允許並行處理:如果“比較”方法至少消耗了明顯的CPU時間,則可以使用多個進程。

假設您的CPU中有多個內核,則速度將大大提高。 采用

  • 一個從hdf讀取數據並將其放入隊列的過程
  • 一個從隊列中抓取並進行比較並將結果放入“輸出隊列”的過程
  • 一種收集結果的過程。

選擇方式之前:“了解敵人”,即使用剖析! 只有在瓶頸處有所改善,優化才值得付出努力,因此,首先要找出哪些方法會浪費您寶貴的CPU時間。

您的算法為O(n ^ 2),對大數據不利。 您是否沒有機會通過應用某些邏輯來減少這種情況? 這始終是最好的方法。

問候,

索斯滕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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