Yah Menurut komentar pada jawaban shuf dia mengocok 78.000 000 baris dalam waktu kurang dari satu menit.
Tantangan diterima...
EDIT: Saya mengalahkan rekor saya sendiri
powershuf melakukannya dalam 0,047 detik
$ 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
Alasannya sangat cepat, baik saya tidak membaca seluruh file dan hanya memindahkan pointer file 10 kali dan mencetak baris setelah pointer.
Gitlab Repo
Usaha lama
Pertama saya membutuhkan file 78.000.000.000 baris:
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
Ini memberi saya file dengan 78 Miliar baris baru ;-)
Sekarang untuk bagian 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
Hambatannya adalah CPU dan tidak menggunakan banyak utas, itu disematkan 1 inti pada 100% 15 lainnya tidak digunakan.
Python adalah apa yang saya gunakan secara teratur sehingga itulah yang akan saya gunakan untuk membuatnya lebih cepat:
#!/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))
Ini membuat saya kurang dari satu menit:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Saya melakukan ini pada Lenovo X1 ekstrim 2nd gen dengan i9 dan Samsung NVMe yang memberi saya banyak kecepatan baca dan tulis.
Saya tahu ini bisa lebih cepat tetapi saya akan meninggalkan beberapa ruang untuk mencoba yang lain.
Sumber penghitung garis : Luther Blissett