Ну Відповідно до коментаря до відповіді shuf, він перемістив 78 000 000 000 рядків за хвилину.
Виклик прийнятий...
EDIT: Я побив власний рекорд
powerhuf зробив це за 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 разів і друкую рядок після вказівника.
Gitlab Repo
Стара спроба
Спочатку мені знадобився файл з 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 мільярдами нових рядків ;-)
Тепер про частину шуфу:
$ 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 з i9 та Samsung NVMe, що дає мені велику швидкість читання та запису.
Я знаю, що це може пройти швидше, але я залишу трохи кімнати, щоб спробувати інших.
Джерело лічильника ліній : Лютер Бліссет