ดีตามความคิดเห็นในคำตอบ shuf เขา shuffed 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 ครั้งแล้วพิมพ์บรรทัดหลังตัวชี้
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 พันล้าน newlines ;-)
ตอนนี้สำหรับส่วน 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
คอขวดคือ CPU และไม่ได้ใช้หลายเธรดมันตรึง 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 2nd Gen ด้วย i9 และ Samsung NVMe ซึ่งให้ความเร็วในการอ่านและเขียนมากมาย
ฉันรู้ว่ามันจะเร็วขึ้น แต่ฉันจะออกจากห้องเพื่อให้คนอื่นลอง
แหล่งที่มาของตัวนับบรรทัด: Luther Blissett