ค้นหาแบบไบนารีในไฟล์ข้อความที่เรียงลำดับ


13

ฉันมีไฟล์เรียงลำดับขนาดใหญ่ที่มีความยาวหลายพันล้านบรรทัด รับสายใหม่ฉันต้องการที่จะรู้ว่าจำนวนไบต์มันจะได้รับถ้ามันถูกรวมอยู่ในไฟล์ที่เรียง

ตัวอย่าง

a\n
c\n
d\n
f\n
g\n

รับอินพุต 'foo' ฉันจะได้ผลลัพธ์ 9

สิ่งนี้ทำได้ง่ายเพียงแค่ทำการผ่านไฟล์ทั้งหมด แต่การที่มีความยาวของตัวแปรหลายพันล้านบรรทัดมันจะเร็วกว่าที่จะทำการค้นหาแบบไบนารี

เครื่องมือการประมวลผลข้อความมีอยู่แล้วหรือไม่?

แก้ไข:

มันทำตอนนี้: https://gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch


บรรทัดที่คุณค้นหามีความยาวเท่าใด (เป็นตัวอักษร) และจำนวนบรรทัดที่คุณต้องการค้นหา
gogoud

@gogoud ฉันไม่ได้กำลังมองหาเครื่องมือที่มีอยู่อย่าง จำกัด แต่มีเครื่องมือหนึ่งที่ทำงานกับ textfile ใด ๆ (ไม่ว่าจะมีความยาวบรรทัดหรือจำนวนบรรทัดเท่าใด)
Ole Tange

สำหรับผู้ที่อาจต้องการสร้างอินพุตขนาดมหึมาเช่น: unix.stackexchange.com/a/279098/9689
Grzegorz Wierzowiecki

คำตอบ:


4

ฉันไม่ได้ตระหนักถึงเครื่องมือมาตรฐานบางอย่างที่ทำเช่นนี้ อย่างไรก็ตามคุณสามารถเขียนของคุณเอง ตัวอย่างเช่นสคริปต์ทับทิมต่อไปนี้ควรทำงาน

file, key = ARGV.shift, ARGV.shift
min, max = 0, File.size(file)

File.open(file) do |f|
  while max-min>1 do
    middle = (max+min)/2
    f.seek middle
    f.readline
    if f.eof? or f.readline>=key
      max = middle
    else
      min = middle
    end
  end
  f.seek max
  f.readline
  p f.pos+1
end

มันค่อนข้างยุ่งยากเพราะหลังจากการค้นหาคุณมักจะอยู่ตรงกลางของบรรทัดดังนั้นจึงต้องทำหนึ่งบรรทัดเพื่อไปที่จุดเริ่มต้นของบรรทัดต่อไปนี้ซึ่งคุณสามารถอ่านและเปรียบเทียบกับคีย์ของคุณ


สามารถเปลี่ยนแปลงเพื่อยอมรับ -n / -r เพื่อประมวลผลไฟล์ที่เรียงลำดับตามsort -rและได้sort -nหรือไม่?
Ole Tange

รหัสด้านบนส่วนใหญ่จะแสดงความคิด มันไกลจากความสมบูรณ์แบบ (ตัวอย่างเช่นจะล้มเหลวหากคีย์ไปที่ตำแหน่งแรก) รู้สึกอิสระที่จะปรับให้เข้ากับความต้องการของคุณ
michas

5

(นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของคุณเป็นเพียงจุดเริ่มต้น)

ฉันใช้sgrep (grep เรียงลำดับ) ในสถานการณ์ที่คล้ายกัน

น่าเสียดายที่ (เราต้องการสถานะปัจจุบัน) มันไม่มีเอาต์พุตออฟเซ็ตไบต์ แต่ฉันคิดว่ามันสามารถเพิ่มได้ง่าย


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