在pytable中同时访问多个表

时间:2019-03-31 20:14:24

标签: concurrency hdf5 pytables

我正在尝试将时态嵌入存储在pytable中。有12个表,每个表有130,000多行,其中每个表有两列(单词varchar,嵌入float(numpy.arry(300,)))。我想要的是针对给定表中的所有单词计算给定的余弦相似度,并对所有12个表重复此过程。目前,我通过对每个表进行迭代来依次执行此操作,但是要为所有12个表进行计算大约需要15分钟。

所以我的问题是,是否可以同时读取所有表?我使用了多线程,但是我出错了

Segmentation fault: 11 

下面是我的代码段

def synchronized_open_file():
   with lock:
     return tb.open_file(FILENAME, mode="r", title="embedding DB")

def synchronized_close_file(self, *args, **kwargs):
   with lock:
      return self.close(*args, **kwargs)

outqueue = queue.Queue()

for table in list_table :
        thread = threading.Thread(target=self.top_n_similar, args=(table,))
        thread.start()
        threads.append(thread)

    try:
        for _ in range(len(threads)):
            result =  outqueue.get()
            if isinstance(result, Exception):
                raise result
            else:
                top_n_neighbor_per_period[result[0]] = result[1]
    finally:
        for thread in threads:
            thread.join()

def top_n_similar(table_name):
    H5FILE = synchronized_open_file() 
    do work()
    outqueue.put(result)
    finally :
        synchronized_close_file(H5FILE)

1 个答案:

答案 0 :(得分:0)

是的,您可以同时访问多个pytable对象。下面提供了一个简单的示例,该示例使用(300,2)numpy记录数组创建了3个表,该数组由随机数据创建。它演示了您可以将所有3个表作为表对象-OR-作为numpy数组(或同时作为两者)进行访问。
我没有对pytables做多线程处理,因此无济于事。我建议您在添加多线程之前让代码以串行方式工作。另外,请查看pytables文档。我知道h5py具有使用mpi4py进行多线程的特定过程。 Pytables可能有类似的要求。

代码示例

import tables as tb
import numpy as np

h5f = tb.open_file('SO_55445040.h5',mode='w')

mydtype = np.dtype([('word',float),('varchar',float)])

arr = np.random.rand(300,2)

recarr = np.core.records.array(arr,dtype=mydtype)
h5f.create_table('/', 'table1', obj=recarr )

recarr = np.core.records.array(2.*arr,dtype=mydtype)
h5f.create_table('/', 'table2', obj=recarr )

recarr = np.core.records.array(3.*arr,dtype=mydtype)
h5f.create_table('/', 'table3', obj=recarr )

h5f.close()

h5f = tb.open_file('SO_55445040.h5',mode='r')

# Return Table ojbects:
tb1 = h5f.get_node('/table1')
tb2 = h5f.get_node('/table2')
tb3 = h5f.get_node('/table3')

# Return numpy arrays:
arr1 = h5f.get_node('/table1').read
arr2 = h5f.get_node('/table2').read
arr3 = h5f.get_node('/table3').read

h5f.close()