Eh bien, selon un commentaire sur la réponse shuf, il a mélangé 78 000 000 000 lignes en moins d'une minute.
Défi accepté...
EDIT: j'ai battu mon propre record
powershuf l'a fait en 0,047 seconde
$ 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 raison pour laquelle il est si rapide, eh bien je ne lis pas tout le fichier et je déplace simplement le pointeur de fichier 10 fois et j'imprime la ligne après le pointeur.
Gitlab Repo
Vieille tentative
J'ai d'abord eu besoin d'un fichier de 78.000.000.000 lignes:
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
Cela me donne un fichier avec 78 milliards de nouvelles lignes ;-)
Maintenant pour la partie 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
Le goulot d'étranglement était CPU et n'utilisant pas plusieurs threads, il a épinglé 1 cœur à 100%, les 15 autres n'ont pas été utilisés.
Python est ce que j'utilise régulièrement, c'est ce que j'utiliserai pour accélérer les choses:
#!/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))
Cela m'a pris un peu moins d'une minute:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Je l'ai fait sur un Lenovo X1 extreme 2nd gen avec l'i9 et le Samsung NVMe, ce qui me donne beaucoup de vitesse de lecture et d'écriture.
Je sais que ça peut aller plus vite mais je vais laisser de la place pour essayer les autres.
Compteur de ligne source: Luther Blissett