我有一个相当大的数据集,我存储在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])
答案 0 :(得分:0)
我建议采用两种方法:
numpy memmap:创建一个内存映射数组,将数据放入其中,然后运行“Small Set”代码。内存映射的行为几乎与数组类似。
使用多处理模块允许并行处理:如果“比较”方法至少消耗了大量的CPU时间,则可以使用多个进程。
假设CPU中有多个核心,这将显着加快。使用
在选择方式之前:“了解你的敌人”,即使用剖析!如果你在瓶颈方面有所改进,那么优化只值得努力,所以首先找出哪些方法会消耗你宝贵的CPU时间。
您的算法为O(n ^ 2),这对大数据不利。难道你没有看到任何机会减少这种情况,例如,通过应用一些逻辑?这始终是最好的方法。
问候,
和Thorsten