Давайте предположим, что у меня есть текстовый файл с только 2 строки следующим образом:Python многопроцессорная: Чтение файла и обновление словаря
File.txt:
100022441 @DavidBartonWB Guarding Constitution
100022441 RT @frankgaffney 2nd Amendment Guy.
Первый столбец идентификатор пользователя и второй столбец пользователь твит. Я хотел бы, чтобы прочитать выше текстовый файл и обновить следующий словарь:
d={'100022441':{'@frankgaffney': 0, '@DavidBartonWB': 0}}.
Вот мой код:
def f(line):
data = line.split('\t')
uid = data[0]
tweet = data[1]
if uid in d.keys():
for gn in d[uid].keys():
if gn in tweet:
return uid, gn, 1
else:
return uid, gn, 0
p = Pool(4)
with open('~/File.txt') as source_file:
for uid, gn, r in p.map(f, source_file):
d[uid][gn] += r
Поэтому в основном мне нужно прочитать каждую строку файла и определить, является ли пользователь находится в моем словаре, и если это так, то ли твит содержит ключи пользователя в словаре (например, «@frankgaffney» и «@DavidBartonWB»). Таким образом, на основе двух линий, которые я написал выше, код должен привести:
d = {{'100022441':{'@frankgaffney': 1, '@DavidBartonWB': 1 }}
Но это дает:
d = {{'100022441':{'@frankgaffney': 1, '@DavidBartonWB': 0 }}
По какой-то причине код всегда теряет один из ключей для всех пользователей. Любая идея, что не так в моем коде?
Большое спасибо за это отличное решение.Первый код работает отлично и довольно быстро по сравнению с моим. Но второй код (т. Е. Многопроцессорный) не работает. Он поддерживает работу ядра без использования процессора и никогда не останавливается даже для текстового файла с 2 строками. – msmazh
Да, я написал выше в спешке и пропустил несколько вещей. Существует также [ошибка] (http://bugs.python.org/issue6766), которая предотвращает правильное обновление суб-словарей при использовании в многопроцессорной обработке. –
Я обновил ответ с рабочей версией, у которой есть некоторые компромиссы, чтобы обойти ошибку [update update] (http://bugs.python.org/issue6766). –