เคียวรีระยะห่างอย่างรวดเร็วขัดขวางในระดับสูงกว่า


15

ฉันมีฐานข้อมูลขนาดใหญ่ (แถว 16M) ที่มีแฮชการรับรู้ภาพ

ฉันต้องการที่จะสามารถค้นหาแถวตามระยะทาง hammingในกรอบเวลาที่เหมาะสม

ในปัจจุบันเท่าที่ฉันเข้าใจปัญหาอย่างถูกต้องแล้วฉันคิดว่าตัวเลือกที่ดีที่สุดในที่นี้คือการติดตั้ง SP-GiST แบบกำหนดเองที่ใช้BK-Treeแต่ดูเหมือนว่าจะใช้งานได้มากและฉันก็ยังคลุมเครือในทางปฏิบัติ รายละเอียดของการปรับใช้ดัชนีที่กำหนดเองอย่างเหมาะสม การคำนวณระยะทาง Hamming คือเวไนยพอและผมทำรู้ C แม้ว่า

โดยพื้นฐานแล้ววิธีการที่เหมาะสมในที่นี้คืออะไร? ฉันต้องสามารถสอบถามการจับคู่ภายในระยะทางแก้ไขที่แน่นอนของแฮช ตามที่ผมเข้าใจมัน Levenshtein ระยะทางกับสตริงความยาวเท่ากันเป็นหน้าที่ hamming ระยะเพื่อให้มีอย่างน้อยบางส่วนสนับสนุนที่มีอยู่สำหรับสิ่งที่ฉันต้องการแม้ว่าจะไม่มีวิธีการที่ชัดเจนในการสร้างดัชนีจากมัน (จำค่าที่ผมสอบถาม การเปลี่ยนแปลงฉันไม่สามารถคำนวณระยะทางจากค่าคงที่ล่วงหน้าได้เนื่องจากจะมีประโยชน์สำหรับค่านั้นเท่านั้น

แฮชปัจจุบันถูกเก็บเป็นสตริง 64- ถ่านที่มีการเข้ารหัส ASCII แบบไบนารีของแฮช (เช่น "10010101 ... ") แต่ฉันสามารถแปลงให้เป็น int64 ได้อย่างง่ายดาย ปัญหาจริงคือฉันต้องสามารถสืบค้นได้ค่อนข้างเร็ว

ดูเหมือนว่าจะเป็นไปได้ที่จะบรรลุบางสิ่งบางอย่างตามแนวของสิ่งที่ฉันต้องการpg_trgmแต่ฉันค่อนข้างชัดเจนว่าการจับคู่ mechamism ของ trigram ทำงานอย่างไร (โดยเฉพาะการวัดความคล้ายคลึงกันที่ส่งกลับมาเป็นตัวแทนจริง ๆ )ชนิดของระยะทางแก้ไข)

ประสิทธิภาพการแทรกไม่สำคัญ (ราคาแพงมากในการคำนวณแฮชสำหรับแต่ละแถว) ดังนั้นฉันจึงสนใจเกี่ยวกับการค้นหาเป็นหลัก


ส่วนขยายของ smlar อาจมีสิ่งที่คุณต้องการ: pgcon.org/2012/schedule/attachments/252_smlar-2012.pdfหรือ pg_similarity: pgcon.org/2009/schedule/attachments/108_pg_similarity.pdf
Neil McGuigan

@NeilMcGuigan - น่าสนใจ! งานนำเสนอแรกมีจริงจากคนที่รักษา SP-GiST และระบบ GIST ใน postgres
ชื่อปลอม

ลิงค์แรกมีไว้สำหรับบางสิ่งบางอย่างที่แตกต่างกันโดยพื้นฐาน พวกเขากำลังมองหาจุดตัดที่ตั้งค่าไว้ในขณะที่ฉันกำลังมองหาระยะห่างแฮ็ก ฉันสามารถแบ่งชุดข้อมูลออกเป็นชุด ๆ ได้ แต่มันจะยุ่งมากและต้องใช้รหัสสนับสนุนมากมายทุกที่
ชื่อปลอม

FWIW ณ จุดนี้ฉันได้ข้อสรุปไม่มากก็น้อยฉันต้องใช้ระบบการจัดทำดัชนีของตัวเอง ฉันกำลังดูดัชนี SP-GiST ที่กำหนดเองในขณะนี้ แต่ฉันไม่รู้ว่ากำลังทำอะไรอยู่
ชื่อปลอม

1
@ ชื่อผู้ใช้: เมื่อคุณพูดถึงระยะการแฮ็กข้อมูลฉันถือว่าคุณหมายถึงระยะการเชื่อมต่อของสตริงค่าแฮชไม่ใช่ภาพใช่หรือไม่ พูดอีกอย่างคือคุณกำลังถาม: หาค่าแฮชทั้งหมดซึ่งเป็นการแทนที่ X บิตจากพารามิเตอร์อินพุต
Thomas Kejser

คำตอบ:


11

ฉันใช้เวลาดูการเขียนส่วนขยาย C postgres ที่กำหนดเองและปิดท้ายเพียงแค่เขียน wrapper ฐานข้อมูล Cython ที่รักษาโครงสร้าง BK-tree ไว้ในหน่วยความจำ

โดยทั่วไปจะเก็บรักษาสำเนาในหน่วยความจำของค่า phash จากฐานข้อมูลและการอัปเดตทั้งหมดไปยังฐานข้อมูลจะถูกเล่นซ้ำในทรี BK

มันขึ้นอยู่ทั้งหมดบน GitHub ที่นี่ นอกจากนี้ยังมีการทดสอบหน่วยจำนวนมาก

การสืบค้นข้ามชุดข้อมูลจำนวน 10 ล้านค่าแฮชสำหรับรายการที่มีระยะทาง 4 ผลลัพธ์จะมีผลในการสัมผัส ~ 0.25% -0.5% ของค่าในต้นไม้และใช้เวลาประมาณ ~ 100 ms


BK-Tree ในหน่วยความจำ 16 ล้านแถวในหน่วยความจำ? ฉันดูสิ่งที่คล้ายกัน แต่มี 1,000 ภาพและตัวอธิบาย 2,000 ภาพในแต่ละภาพที่ฉันใช้ในหน่วยความจำขนาดใหญ่มาก
สจ๊วต

@Stewart - สิ่งนี้ขึ้นอยู่กับขนาดของแฮชของคุณ ในกรณีของฉันเอาต์พุตค่าแฮชเป็นบิตฟิลด์ 64 บิตเดียวที่ฉันเก็บเป็น int64 คุณดูเหมือนจะมีประเภทข้อมูล phash ที่ใหญ่กว่ามาก ฉันยังไม่แน่ใจว่าการค้นหาจะทำงานกับประเภทข้อมูลอื่นอย่างไร พวกเขายังคงเป็นพื้นที่เมตริกหรือไม่? คุณคำนวณระยะทางอย่างไร
ชื่อปลอม

ฉันกำลังใช้ตัวบอกรายละเอียด 32 บิตกับ FLANN marcher ที่มาพร้อมกับ opencv ในการคำนวณระยะทางฉันใช้ hamming กับขีด จำกัด ตามอัตราส่วนของ Lowe ณ จุดนี้ฉันไม่แน่ใจว่าวิธีที่ดีที่สุดในการลองใช้กับหน่วยความจำ FLANN ซึ่งมีโครงสร้างแบบต้นไม้ KD หรือเปลี่ยนเป็นโซลูชันที่คล้ายกับของคุณมากขึ้น ทำไมคุณถึงต้องล้มเลิกความคิดของคุณเองและไม่ยอมทำอะไรอย่าง libflann?
สจ๊วต

@Stewart - ฉันไม่ได้ม้วนตัวเอง ฉันใช้การแฮชที่ใช้DFT ที่น่าเบื่อที่สุด
ชื่อปลอม

7

คำตอบของ MOAR!

ตกลงฉันได้ใช้เวลาในการเขียนส่วนขยายการจัดทำดัชนี PostgreSQL ที่กำหนดเองในที่สุด ผมใช้อินเตอร์เฟซ SP-GIST

นี้ได้อย่างเป็นธรรมที่ท้าทายมากเพราะ Posgres เป็นใหญ่

Anyways ตามปกติมันก็ขึ้นอยู่บน GitHub ที่นี่

ประสิทธิภาพการทำงานขณะนี้ช้ากว่าการใช้งานหน่วยความจำอย่างบริสุทธิ์ใจในคำตอบอื่น ๆ ของฉัน ~ 2 ถึง 3 เท่า แต่มันสะดวกกว่าที่จะใช้ฉันจะกินผลงานนั้นอย่างมีความสุข ms / query - 150 ms / query ซึ่งยังค่อนข้างเล็ก)


คุณยอดเยี่ยมมาก! คุณสามารถเพิ่ม README ในวิธีการติดตั้งได้หรือไม่? ฉันไม่เคยติดตั้งอะไรเลยใน Postgres: P
HypeWolf

1
@HypeWolf - รากของธุรกรรมซื้อคืนที่มี README ไม่ครอบคลุมสิ่งที่คุณต้องการหรือไม่
ชื่อปลอม

ความผิดพลาดของฉันฉันไม่เห็นฉันไม่แน่ใจว่าฉันอยู่ที่ไหน: /
HypeWolf

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