Bem De acordo com um comentário sobre a resposta shuf, ele embaralhou 78 000 000 000 linhas em menos de um minuto.
Desafio aceito...
EDIT: Eu bati meu próprio recorde
powershuf fez isso em 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
O motivo é tão rápido, bem, eu não leio o arquivo inteiro e apenas movo o ponteiro do arquivo 10 vezes e imprimo a linha após o ponteiro.
Repositório Gitlab
Tentativa antiga
Primeiro eu precisava de um arquivo de 78.000.000.000 linhas:
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
Isso me dá um arquivo com 78 bilhões de novas linhas ;-)
Agora, para a 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
O gargalo era a CPU e não usava vários encadeamentos; fixou 1 núcleo em 100% e os outros 15 não foram usados.
Python é o que eu uso regularmente, e é isso que vou usar para tornar isso mais 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))
Isso me deixou em menos de um minuto:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Eu fiz isso em um Lenovo X1 extremo de segunda geração com o i9 e o Samsung NVMe, o que me proporciona muita velocidade de leitura e gravação.
Eu sei que pode ficar mais rápido, mas vou deixar um espaço para tentar outros.
Fonte do contador de linhas : Luther Blissett