Ну, согласно комментарию к ответу shuf, он переставил 78 000 000 000 строк менее чем за минуту.
Вызов принят...
РЕДАКТИРОВАТЬ: я побил свой собственный рекорд
powershuf сделал это за 0,047 секунды
$ 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
Причина, по которой это так быстро, хорошо, я не читаю весь файл, а просто перемещаю указатель файла 10 раз и печатаю строку после указателя.
Гитлаб Репо
Старая попытка
Сначала мне понадобился файл из 78.000.000.000 строк:
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
Это дает мне файл с 78 миллиардов новых строк ;-)
Теперь для части 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
Узким местом был процессор и не использовались несколько потоков, он закрепил 1 ядро на 100%, остальные 15 не использовались.
Python - это то, что я регулярно использую, поэтому я буду использовать это, чтобы сделать это быстрее:
#!/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))
Это дало мне чуть меньше минуты:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Я сделал это на Lenovo X1 extreme 2-го поколения с i9 и Samsung NVMe, что дает мне много скорости чтения и записи.
Я знаю, что это может стать быстрее, но я оставлю некоторую комнату, чтобы дать другим попробовать.
Линия счетчик источника: Лютер Блиссетт