У меня есть большой файл, который мне нужно прочитать и сделать словарь. Я хотел бы, чтобы это было как можно быстрее. Однако мой код в python слишком медленный. Вот минимальный пример, который показывает проблему.
Сначала сделайте некоторые поддельные данные
paste <(seq 20000000) <(seq 2 20000001) > largefile.txt
Теперь вот минимальная часть кода на Python, чтобы прочитать ее и сделать словарь.
import sys
from collections import defaultdict
fin = open(sys.argv[1])
dict = defaultdict(list)
for line in fin:
parts = line.split()
dict[parts[0]].append(parts[1])
Тайминги:
time ./read.py largefile.txt
real 0m55.746s
Однако можно прочитать весь файл гораздо быстрее, чем:
time cut -f1 largefile.txt > /dev/null
real 0m1.702s
Мой процессор имеет 8 ядер, можно ли распараллелить эту программу в python, чтобы ускорить его?
Одной из возможностей может быть чтение в больших фрагментах ввода, а затем одновременное выполнение 8 процессов на разных неперекрывающихся подчленях, создающих словари параллельно из данных в памяти, а затем чтение в другом большом фрагменте. Возможно ли это в python с использованием многопроцессорности?
Обновление. Поддельные данные были не очень хорошими, поскольку для каждого ключа было только одно значение. Лучше
perl -E 'say int rand 1e7, $", int rand 1e4 for 1 .. 1e7' > largefile.txt
(Связано с Читайте в большом файле и создайте словарь.)