Bueno, según un comentario sobre la respuesta de shuf, barajó 78 000 000 000 líneas en menos de un minuto.
Desafío aceptado...
EDITAR: batí mi propio récord
powershuf lo hizo en 0.047 segundos
$ 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 razón es que es tan rápido, bueno, no leo todo el archivo y simplemente muevo el puntero del archivo 10 veces e imprimo la línea después del puntero.
Gitlab Repo
Viejo intento
Primero necesitaba un archivo de 78,000,000,000 líneas:
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
Esto me da un archivo con 78 mil millones de nuevas líneas ;-)
Ahora para 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
El cuello de botella era CPU y no usaba múltiples hilos, fijó 1 núcleo al 100% y los otros 15 no se usaron.
Python es lo que uso regularmente, así que eso es lo que usaré para hacer esto más rápido:
#!/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))
Esto me consiguió poco menos de un minuto:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Hice esto en un Lenovo X1 extreme 2nd gen con el i9 y Samsung NVMe, lo que me da mucha velocidad de lectura y escritura.
Sé que puede ser más rápido, pero dejaré espacio para intentarlo.
Fuente del contador de línea : Luther Blissett