Bene Secondo un commento sulla risposta shuf, ha misurato 78.000.000.000 di righe in meno di un minuto.
Sfida accettata...
EDIT: ho battuto il mio record
powershuf lo ha fatto in 0,047 secondi
$ time ./powershuf.py -n 10 --file lines_78000000000.txt > /dev/null
./powershuf.py -n 10 --file lines_78000000000.txt > /dev/null 0.02s user 0.01s system 80% cpu 0.047 total
La ragione per cui è così veloce, beh, non leggo l'intero file e muovo il puntatore del file 10 volte e stampo la riga dopo il puntatore.
Gitlab Repo
Vecchio tentativo
Per prima cosa avevo bisogno di un file di 78.000.000.000 di righe:
seq 1 78 | xargs -n 1 -P 16 -I% seq 1 1000 | xargs -n 1 -P 16 -I% echo "" > lines_78000.txt
seq 1 1000 | xargs -n 1 -P 16 -I% cat lines_78000.txt > lines_78000000.txt
seq 1 1000 | xargs -n 1 -P 16 -I% cat lines_78000000.txt > lines_78000000000.txt
Questo mi dà un file con 78 miliardi di nuove righe ;-)
Ora per la parte shuf:
$ time shuf -n 10 lines_78000000000.txt
shuf -n 10 lines_78000000000.txt 2171.20s user 22.17s system 99% cpu 36:35.80 total
Il collo di bottiglia era CPU e non utilizzava più thread, ha bloccato 1 core al 100%, gli altri 15 non sono stati utilizzati.
Python è quello che uso regolarmente, quindi è quello che userò per renderlo più veloce:
#!/bin/python3
import random
f = open("lines_78000000000.txt", "rt")
count = 0
while 1:
buffer = f.read(65536)
if not buffer: break
count += buffer.count('\n')
for i in range(10):
f.readline(random.randint(1, count))
Questo mi ha portato poco meno di un minuto:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
L'ho fatto su un Lenovo X1 extreme 2nd gen con i9 e Samsung NVMe che mi dà molta velocità di lettura e scrittura.
So che può andare più veloce, ma lascerò un po 'di spazio per provare gli altri.
Fonte contatore linea : Luther Blissett