Я пытаюсь мультипроцессировать один из моих скриптов.Сценарий считывает все данные из файла и записывает в другой файл соответствующие строки (например, все ученики, чье имя - Джейкоб).
Исходный сценарий:
search_val = "jacob"
with open("big_file.txt") as f:
with open("matches.txt", "w") as f_out:
for line in f:
if (search_val in line.lower()):
f_out.write(line)
ЭтоСценарий и multiprocess
оба дают хорошие результаты для небольших файлов, но оригинальный сценарий также работает с нагрудными файлами.
Многопроцессный сценарий:
from multiprocessing import Pool
import threading
import time
import Queue
import sys
search_val = {"key1" : [], "key2" : [], "key3":[]}
def process_line(line):
global search_val
key_val_list = []
for key in search_val.keys():
if (key.lower() in line.lower()):
search_val[key].append(line.strip())
key_val_list.append({key:line})
return key_val_list
#with open("big_file.txt") as f:
def get_lines():
with open("small_file.txt") as f:
yield f
if __name__ == "__main__":
pool = Pool(8)
file_lines = get_lines()
start = time. time()
end = time. time()
#print(end - start)
results = pool.map(process_line, next(file_lines), 8)
#pool.close()
#print(results)
print("Done reading")
end = time. time()
print(end - start)
with open("results.txt", "w") as f_out:
f_out.write(str(results))
print("Done saving results")
end = time. time()
print(end - start)
print_dict= {}
for line in results:
for result in line:
for key in result.keys():
if key in print_dict.keys():
print_dict[key].append(result[key].strip())
else:
print_dict[key] = [result[key].strip()]
print("Done ordering")
end = time. time()
print(end - start)
for key in print_dict.keys():
with open(key+".txt", "w") as f_out:
for val in print_dict[key]:
f_out.write(val + "\n")
, вы можете использовать его как маленький файл:
key2@key1.co.il
key3@key1.net
key4@key1.co.uk
key5@key1.co.il
Этот сценарий отлично работает для небольших файлов, но не генерирует никаких результатов (даже не выводит «Закончено чтение») для big_file.Размер большого_файла составляет 11 ГБ.
У меня есть 2 вопроса:
- Использовал ли я yield так, как мне кажется?
- У вас есть идея, почему это не так?не работает?
Я также пытался обновить карту search_val (которая является глобальным параметром), но это тоже не сработало, поэтому я попробовал опцию списка.
Если выесть идеи, которыми вы можете поделиться.