我正在尝试将时态嵌入存储在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)
答案 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()