เหตุใดการจับคู่สตริง 1250 กับรูปแบบ 90k จึงช้า


12

สตริงของฉันเป็นเส้นทางไฟล์เช่นs/14/11/13/15/n7ce49B_235_25ed2d70.jpg; รูปแบบของฉันค่อนข้างเรียบง่ายเหมือนn7ce49B_.+กันหมด

ฉันทำงานGNU grep 2.6.3ภายใต้Debian 6.0.10บนเซิร์ฟเวอร์Dell DL360G7 (ฉันพูดถึงเพียงให้ความรู้สึกของเครื่องนี้เต็มประสิทธิภาพ) ด้วย HDD 15k และคำสั่งนี้: time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_fileไม่สามารถทำให้เสร็จสมบูรณ์ - เซิร์ฟเวอร์แลกเปลี่ยนไม่ดีเกินไป ด้วยรูปแบบ 20k ใช้เวลานานกว่า 3 ชั่วโมง

ดูเหมือนว่าไม่มีเหตุผลสำหรับฉัน

ตามคำขอความคิดเห็นมีไฟล์: รูปแบบไฟล์เส้นทาง 20k

หนึ่งอาจทดสอบและปรับจำนวนบรรทัดอินพุตและรูปแบบด้วย:

xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
  grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)

3
ชื่อของคุณมี90kคำอธิบายมี20Kรูปแบบ
RomanPerekhrest

2
90k คือขนาดอินพุตดั้งเดิมของฉันและนั่นทำให้การสลับเครื่องของฉันยากจนฉันต้องกำจัด grep นั้น จากนั้นฉันก็พยายามแบ่งไฟล์นี้เป็น 20k และมันก็ยังทำงานได้อย่างน่ากลัว ... แต่คุณพูดถูกแล้วว่าคำอธิบายของฉันไม่สอดคล้องกัน
skaurus

2
กรุณาชี้แจงหรือไม่ว่าเซิร์ฟเวอร์อาจได้รับการขูดรีด (ทำบางทรัพยากรอื่น ๆ งานหิว) grepระหว่าง
agc

2
xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)หนึ่งสามารถทำซ้ำกับ ดูเหมือนว่าเวลาที่ใช้ในการรวบรวม regexps และการจัดสรรหน่วยความจำจำนวนมาก ด้วย-Fแทน-Eมันทันที
Stéphane Chazelas

2
สำหรับเรื่องนั้นไม่n7ce49B_.+เท่ากับn7ce49B_.
Stéphane Chazelas

คำตอบ:


15

คุณพบปัญหาเรื่องประสิทธิภาพใน grep GNU รุ่นเก่า ( ข้อผิดพลาด # 22357 ) ที่ได้รับการแก้ไขโดยคอมมิชชันนี้เผยแพร่ใน 2.28 แม้ว่าการเปลี่ยนแปลงนั้นจะนำการถดถอยมาใช้ดังนั้นคุณต้องการรับ GNU grep3.0 หรือใหม่กว่าแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.