Я искал, вероятно, 10 потоков при многопроцессорном поиске, но, похоже, ничего не подходит для моего варианта использования. Вот общее представление о том, что я хочу распараллелить.
class foo():
def boo():
filename = 'path to the data file'
with reader(filename) as fileReader:
for id, feature in fileReader:
boo2(id, feature)
def boo2(id, feature):
*process feature then save the output to a folder*
Здесь я хочу распараллелить вызов к boo2()
, где fileReader
- итератор ( sequentialMatrixReader из pykaldi) с десятками тысяч строк id
и feature
, где id - это строка, а каждая feature
- это матрица (сотни строк x десятки столбцов). boo2
вычислит матрицу меньшего размера и сохранит результат в папке на основе id
. Каждый вызов boo2
не зависит друг от друга, поэтому я хочу распараллелить его.
Насколько я понимаю, я не могу использовать multiprocessing.Pool
, поскольку boo2 - это функция класса, и я не могу вытащить ее из класса из-за ее сложности.
Я не знаю, как использовать multiprocessing.Process
, так как количество ядер намного меньше, чем число строк итератора, и я не уверен, как ставить новые вызовы на boo2
, как только яstart()
и join()
процессов (я пытался разбить fileReader на n пакетов и установить процесс на пакет, однако я бы предпочел ставить вызовы в одну строку по сравнению с несколькими пакетами)
Я также изучил модуль pathos
, поскольку у него нет проблем с функциями класса. Однако из примеров использования наиболее подходящим для меня является:
pathos.threading.ThreadPoolpool.imap(boo2, [feature for feature in fileReader])
Но из-за того, что у меня fileReader, я не могу разместить [feature for feature in fileReader]
в памяти.
Любой и всепомощь приветствуется. Спасибо.