Leia arquivo grande em paralelo?
Eu tenho um arquivo grande que eu preciso ler e fazer um dicionário. Eu gostaria que isso fosse o mais rápido possível. No entanto, meu código em python é muito lento. Aqui está um exemplo mínimo que mostra o problema.
Primeiro, faça alguns dados falsos
paste <(seq 20000000) <(seq 2 20000001) > largefile.txt
Agora, aqui está uma pequena parte do código python para ler e criar um dicionário.
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])
Horários:
time ./read.py largefile.txt
real 0m55.746s
No entanto, é possível ler o arquivo inteiro muito mais rápido como:
time cut -f1 largefile.txt > /dev/null
real 0m1.702s
Meu processador tem 8 núcleos, é possível paralelizar este programa em python para acelerá-lo?
Uma possibilidade pode ser ler em grandes blocos da entrada e, em seguida, executar 8 processos em paralelo em diferentes sub-unidades não sobrepostas, tornando os dicionários em paralelo a partir dos dados na memória e, em seguida, lendo em outro grande bloco. Isso é possível em python usando multiprocessamento de alguma forma?
Atualizar. Os dados falsos não eram muito bons, pois tinham apenas um valor por chave. Melhor é
perl -E 'say int rand 1e7, $", int rand 1e4 for 1 .. 1e7' > largefile.txt
(Relacionado aLeia no arquivo grande e faça o dicionário .)