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