Wpis z mikrobloga

Mirki spod tagu #programowanie.
Mam dwa pliki:
1) zajmuje 5GB i jest w nim 150mln wierszy "nazwa liczba1 liczba2"
2) zajmuje 60MB i jest w nim 150k wierszy "nazwa liczba0"

Da się je skutecznie (tj. w rozsądnym czasie) połączyć względem kolumny "nazwa"?
W pliku wynikowym (będzie zajmował pewnie ze 200MB) mają być "nazwa liczba0 liczba1 liczba2".
Próbowałem w #python wczytać 150k wierszy - da się ( ͡° ͜ʖ ͡°), ale już znalezienie w 150mln i wypisanie ich do pliku będzie trwać ze 70h.
Próbowałem w #awk coś takiego:
awk 'NR==FNR {h[$1] = $2" "$3; next} {print $1,$2,$3,h[$1]} system("")' plik1 plik2 > plik3
ale właściwie stoi w miejscu i nic nie wypisuje do pliku.

Da się to zrobić szybciej? Czy pod osłoną nocy wrzucać to na klaster komputerowy? ( ͡° ͜ʖ ͡°)

#pytanie #pytaniedoeksperta
  • 26
Czy każda „nazwa” występuje w każdym pliku dokładnie jeden raz?


@Alkreni: tak. Lepiej od razu wkleję fragmenty plików.

Plik 1)
BLG100.1.1 0.447679 -0.038985
BLG100.1.2 0.944482 -0.454577
BLG100.1.3 1.603496 -0.042718
BLG100.1.4 0.899882 0.302432
BLG100.1.5 0.266393 1.045791
BLG100.1.6 0.754660 0.066516
BLG100.1.7 0.744046 -0.056969
BLG100.1.8 0.440932 0.377768
BLG100.1.9 0.596077 0.000429
BLG100.1.10 0.108832 0.534986
...
Plik 2)
BLG100.1.2 reltot= 3.538064
BLG100.1.3 reltot= 4.255152
BLG100.1.6 reltot= 3.951874
BLG100.1.7 reltot= 2.941171
BLG100.1.10 reltot= 18.785726
...
@Siotson: jak na moje to ogarnij zagadnienie takie jak sortowanie taśmowe, raczej dałoby radę to przerobić na łączenie, a to o tyle fajne ze w jednym czasie nie wczytuje całego pliku tylko wycinek. w google wpisz chomikuj struktury baz danych semestr 5 to będzie przykład programu takiego ;)
@Siotson:
# rozbierz duzy plik na malutkie
while read line; do echo "$line" > folder/$( echo "$line" | cut -d' ' -f1 ); done < input.txt
# polacz malutkie w wyjsciowy, jesli malutki pasuje
while read line; do nazwa=$(echo "$line" | cut -d' ' -f1); (test -e folder/"$nazwa" && awk -vL="$line" '{print "$L "$0 }'); done > output.txt