У меня есть огромный текстовый файл, для которого я хочу создать словарь (счетчик). В настоящее время я делаю это с помощью следующего кода:Создание словаря из очень ОГРОМНОГО текстового файла многопоточным способом
with open(file_name) as input_doc:
for line in input_doc:
for word in line.strip().split():
vocab[word] += 1
, но, так как файл огромен, он занимает много времени. Итак, я ищу более быстрый способ сделать это.
Наиболее прямолинейное решение, которое приходит в голову, заключается в хранении пучка строк в списке (небольшие партии) и обрабатывать каждую партию отдельно (параллельно с другими партиями), а в конце - слияние результатов. Таким образом, мы можем сэкономить много времени и можем обрабатывать ранее просмотренные партии (параллельно), в то время как основной поток читает следующую партию строк из файла.
что-то вроде:
buffer_size = 1000
buff = []
vocab = Counter()
number_of_sentences = 1
with open(file_name) as input_doc:
for line in input_doc:
if number_of_sentences % buffer_size == 0:
vocab += update_dictionary(buff) ### Here I should create and call a new thread to work on the new batch
buff = []
else
buff.append(line)
number_of_sentences += 1
Здесь метод update_dictionary() считывает все предложения в данном списке и обновляет свой локальный словарь. Как только это будет сделано, его локальный словарь следует объединить с глобальным. Я пробовал пару часов, но, к сожалению, поскольку я никогда не реализовал многопоточный код на Python, мне не удалось заставить его работать. Не могли бы вы помочь мне реализовать эту идею?
спасибо.
До тех пор, пока вы используете многопоточность 'cpython', вам не поможет. Замок Global Interpreter Lock (GIL) позволяет выполнять только один поток за раз. Есть и другие параллельные версии python, которые могут помочь. Вы можете немного ускориться, заменив часть 'for word in ...' на 'counter.update (слово в слово в line.strip(). Split())' и открыв файл с большим буфер. – tdelaney
[Великий ресурс] (http://stackoverflow.com/questions/11196367/processing-single-file-from-multiple-processes-in-python) – Kevin
Вы просмотрели библиотеку многопроцессорности. каждый процесс может использоваться для подсчета слов в части файла и будет иметь свой собственный посреднический словарь. вы можете затем использовать очередь Multiprocessing для обмена данными с основным процессом –