доступ к нескольким таблицам одновременно в pytable - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь сохранить временное встраивание в 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 голосов
/ 01 апреля 2019

Да, вы можете получить доступ к нескольким объектам pytable одновременно.Ниже приведен простой пример, который создает 3 таблицы с использованием массива (300,2) пустых записей, созданного со случайными данными.Это демонстрирует, что вы можете обращаться ко всем 3 таблицам как к объектам таблиц -ИЛИ- как к массивам (или к обоим).
Я не закончил многопоточность с 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()
...