У меня есть код, который анализирует довольно большое количество XML-файлов (с использованием библиотеки xml.sax) для извлечения данных для будущего машинного обучения. Я хочу, чтобы часть синтаксического анализа работала параллельно (у меня есть 24 ядра на сервере, которые также выполняют некоторые веб-службы, поэтому я решил использовать 20 из них). После разбора я хочу объединить результаты. Следующий код должен делать (и делает) именно то, что я ожидал, но есть проблема с параллельной вещью.Python multiprocessing - Pool.map работает только одна задача (вместо нескольких)
def runParse(fname):
parser = make_parser()
handler = MyXMLHandler()
parser.setContentHandler(handler)
parser.parse(fname)
return handler.getResult()
def makeData(flist, tasks=20):
pool = Pool(processes=tasks)
tmp = pool.map(runParse, flist)
for result in tmp:
# and here the merging part
Когда эта часть начинается она работает некоторое время на 20 ядер, а затем идет только один, и это происходит до слияния части (которая, конечно, работать на только одно ядро).
Может ли кто-нибудь помочь решить эту проблему или предложить способ ускорить работу программы?
Спасибо!
ppiikkaaa
Спасибо! Теперь я использую imap с большим chunksize, но это не ускоряет обработку. Фаза сбора занимает гораздо больше времени, чем обработка собранных данных (что не является тривиальным). У вас есть идея, почему так долго? – user2767966
Сбор, конечно, однопроцессорный, поэтому, вероятно, это зависит от размера результатов, которые нужно собрать. Вы выполняете задачу mapreduce, поэтому одним из ключевых моментов является оптимизация части сокращения. Если вы также можете попробовать «.imap_unordered». Вероятно, небольшое улучшение, но ... –