使用PyTables嵌套迭代HDF5

时间:2013-01-03 15:17:05

标签: python hdf5 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 个答案:

答案 0 :(得分:0)

我建议采用两种方法:

  1. numpy memmap:创建一个内存映射数组,将数据放入其中,然后运行“Small Set”代码。内存映射的行为几乎与数组类似。

  2. 使用多处理模块允许并行处理:如果“比较”方法至少消耗了大量的CPU时间,则可以使用多个进程。

  3. 假设CPU中有多个核心,这将显着加快。使用

    • 从hdf读取数据并放入队列的一个过程
    • 从队列中抓取并执行comparisson并将一些结果放到“output-queue”的一个进程
    • 再次收集结果的一个过程。

    在选择方式之前:“了解你的敌人”,即使用剖析!如果你在瓶颈方面有所改进,那么优化只值得努力,所以首先找出哪些方法会消耗你宝贵的CPU时间。

    您的算法为O(n ^ 2),这对大数据不利。难道你没有看到任何机会减少这种情况,例如,通过应用一些逻辑?这始终是最好的方法。

    问候,

    和Thorsten