Vâng, theo một nhận xét về câu trả lời của shuf, anh ta đã xáo trộn 78 000 000 000 dòng trong vòng một phút.
Thử thách được chấp nhận ...
Đầu tiên tôi cần một tệp gồm 78.000.000.000 dòng:
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
Điều này mang lại cho tôi một tệp aa với 78 tỷ dòng mới ;-)
Bây giờ cho phần 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
Nút thắt là CPU và không sử dụng nhiều luồng, nó đã ghim 1 lõi với 100% còn lại 15 không được sử dụng.
Python là thứ tôi thường xuyên sử dụng vì vậy đó là thứ tôi sẽ sử dụng để làm cho nó nhanh hơn:
#!/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))
Điều này đã cho tôi chỉ dưới một phút:
$ time ./shuf.py
./shuf.py 42.57s user 16.19s system 98% cpu 59.752 total
Tôi đã làm điều này trên Lenovo X1 thế hệ thứ 2 cực mạnh với i9 và Samsung NVMe, cho tôi tốc độ đọc và ghi rất nhiều.
Tôi biết nó có thể nhanh hơn nhưng tôi sẽ rời khỏi một số phòng để thử.
Nguồn truy cập dòng : Luther Blissett