2013-09-11 2 views
1

У меня есть код, который анализирует довольно большое количество 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

ответ

0

Почему вы говорите, что идет только один до завершения?

Вы используете .map(), которые собирают результаты и затем возвращаются. Итак, для большого набора данных, вероятно, вы застряли на фазе сбора.

Вы можете попробовать использовать .imap(), который является версией итератора на .map() или даже .imap_unordered(), если порядок анализа не важен (как это кажется из вашего примера).

Here - соответствующая документация. Стоит отметить строку:

Для очень длинных итерируемых используя большое значение для chunksize может сделать работу полным много быстрее, чем при использовании значения по умолчанию 1.

+0

Спасибо! Теперь я использую imap с большим chunksize, но это не ускоряет обработку. Фаза сбора занимает гораздо больше времени, чем обработка собранных данных (что не является тривиальным). У вас есть идея, почему так долго? – user2767966

+0

Сбор, конечно, однопроцессорный, поэтому, вероятно, это зависит от размера результатов, которые нужно собрать. Вы выполняете задачу mapreduce, поэтому одним из ключевых моментов является оптимизация части сокращения. Если вы также можете попробовать «.imap_unordered». Вероятно, небольшое улучшение, но ... –

Смежные вопросы