Czy czytasz duży plik równolegle?

Mam duży plik, z którego muszę wczytać i utworzyć słownik. Chciałbym, żeby to było jak najszybciej. Jednak mój kod w Pythonie jest zbyt wolny. Oto minimalny przykład pokazujący problem.

Najpierw wymyśl fałszywe dane

paste <(seq 20000000) <(seq 2 20000001)  > largefile.txt

Teraz jest to minimalny fragment kodu Pythona do odczytu i tworzenia słownika.

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])

Czas:

time ./read.py largefile.txt
real    0m55.746s

Jednak można odczytać cały plik znacznie szybciej, ponieważ:

time cut -f1 largefile.txt > /dev/null    
real    0m1.702s

Mój procesor ma 8 rdzeni, czy można zrównoważyć ten program w Pythonie, aby go przyspieszyć?

Jedną z możliwości może być odczytanie dużych fragmentów danych wejściowych, a następnie uruchomienie 8 procesów równolegle na różnych nienakładających się podjednostkach, dzięki czemu słowniki są równoległe z danych w pamięci, a następnie odczytywane w innym dużym fragmencie. Czy jest to możliwe w pythonie wykorzystującym wieloprocesowość?

Aktualizacja. Fałszywe dane nie były zbyt dobre, ponieważ miały tylko jedną wartość na klucz. Lepiej jest

perl -E 'say int rand 1e7, $", int rand 1e4 for 1 .. 1e7' > largefile.txt

(Związany zCzytaj w dużym pliku i stwórz słownik .)

questionAnswers(6)

yourAnswerToTheQuestion