Share
Embed
軽量なインデックス機構を用いた全文検索ツールの高速化の検討/wsa6_sifter
2020.04.26 Web System Architecture 研究会 (WSA研) #6
https://websystemarchitecture.hatenablog.jp/entry/2019/12/11/165624
monochromegane
April 26, 2020
Transcript
43 slides
-
ࡾ༔հ / Pepabo R&D Institute, GMO Pepabo, Inc. 2020.04.26 Web
System Architecture ݚڀձ (WSAݚ) #6 ܰྔͳΠϯσοΫεػߏΛ༻͍ͨ શจݕࡧπʔϧͷߴԽͷݕ౼ -
• ͻͱͭɺ͋Δ͍ෳͷςΩετϑΝΠϧ͔Βࢦఆͨ͠จࣈྻΛݕࡧ͢ΔίϚ ϯυϥΠϯπʔϧ • grep, ag, pt etc… • ϓϩδΣΫτԼͷιʔείʔυݕࡧʹར༻͞ΕΔ
• ଟ༷ͳΦϓγϣϯʹΑΔࠩҟԽ • ݁Ռͷ৭͚ɺલޙͷߦͷදࣔɺgitignoreͷߟྀɺจࣈίʔυରԠͳͲ • ओཁͳࠩҟԽͷཁҼʮݕࡧʯ 9 શจݕࡧπʔϧ -
• ࠶ؼతͳશจݕࡧʮfindʯʮgrepʯʮprintʯͷཁૉ͔ΒΔ • ֤ཁૉͰߴԽͷָ͠Έ͕͋Δ[1] • find: readdirentʹΑΔstatγεςϜίʔϧͷݮɺฒྻԽ • grep: ߦ୯ҐͰͳ͘ݻఆͰͷݕࡧͱ෮ݩɺSIMDɺޮతͳΞϧΰϦζ
ϜɺฒྻԽɺʢOSͷϑΝΠϧΩϟογϡͷԸܙେ͖͍ͱ͜Ζʣ • print: όοϑΝϦϯάɺલஈͷॲཧͷϘτϧωοΫʹͳΔ͜ͱΛճආ • ฒྻԽΛؚΊɺܭࢉࢿݯΛޮΑ͘࠷େݶʹར༻͢Δ [2] 10 શจݕࡧπʔϧͷߴԽ <>:VTVLF.JZBLF 0QUJNJ[BUJPOGPS/VNCFSPGHPSPVUJOFT6TJOH'FFECBDL$POUSPM (PQIFS$PO.BSSJPUU.BSRVJT4BO%JFHP.BSJOB $BMJGPSOJB +VMZ <>:VTVLF.JZBLF UIF@QMBUJOVN@TFBSDIFS IUUQTHJUIVCDPNNPOPDISPNFHBOFUIF@QMBUJOVN@TFBSDIFS -
• ըظతͳΞϧΰϦζϜͰͳ͘ಓͳߴԽͷྗͷੵΈॏͶ • ੑೳ্಄ଧͪͷ • ݕࡧରͷιʔείʔυৗʹมԽ͠͏Δ͜ͱ͔Βɺ ɺશϑΝΠϧͷશจΛݕࡧ͢Δඞཁ͕͋ΔͨΊ 12 શจݕࡧπʔϧͷߴԽͷ՝ •
Մೳੑͷ͋ΔϑΝΠϧ͔ΒͷΈɺશจΛݕࡧ͢ΕߴԽ͕ظͰ͖Δ → ΠϯσοΫεΛͬͨΞϓϩʔνΛݕ౼ -
• ϓϩάϥϛϯάݴޠͷʮΦϒδΣΫτʢؔߏମͳͲʣʯͷΠϯσοΫε Λੜ͢Δʢ࣮΄ͱΜͲ͍ͬͯͳ͍ɻˎཁαʔϕΠʣ • ΦϒδΣΫτΛʮλάʯͱͯ͠ɺ͜ΕΛఆ͍ٛͯ͠ΔϑΝΠϧ໊Λؔ࿈͚ͮΔ • λάϑΝΠϧͷϑΥʔϚοτ͍ΘΏΔసஔΠϯσοΫεͷܗࣜ • λά໊ɺϑΝΠϧؚ໊ΊͨςΩετܗࣜͰ͋ΓαΠζ͕૿Ճ͍͢͠ •
λάϑΝΠϧͷϩʔυʹ͕͔͔࣌ؒΔΑ͏ʹͳΔ • ιʔείʔυݕࡧΦϒδΣΫτҎ֎ରͱͳΓ͏Δ • ίϝϯτΤϥʔϝοηʔδͰݕࡧ͍ͨ͠ɺͳͲ 13 ίϚϯυϥΠϯπʔϧͷΠϯσοΫεʢctagsʣ -
• ͋Δ༻ޠͱɺͦͷ༻ޠ͕ग़ݱ͢ΔจॻIDͷϦετ͔ΒͳΔࣙॻ • ग़ݱසग़ݱҐஔͷཧ͕Մೳ • ڞ௨ू߹ʹର͢ΔΫΤϦಘҙ • ༻ޠɺจॻʹൺྫͯ͠ΠϯσοΫεͷαΠζ͕େ͖͘ͳΔ • ͨͩ͠ɺѹॖͷखཱͯଟ͋Γͦ͏[3]ʢˎཁαʔϕΠʣ
14 શจݕࡧΤϯδϯͷߴԽʢసஔΠϯσοΫεʣ <>$ISJTUPQIFS%.BOOJOH 1SBCIBLBS3BHIBWBO )JOSJDI4DIVU[F ؠੜ ࠇར໌ ᖛా࢘ ଜ্໌ࢠ ใݕࡧͷجૅ ڞཱग़൛ -
• ू߹ͷதʹҙͷཁૉؚ͕·ΕΔ͔Λ͍߹ΘͤΔ֬తσʔλߏ • ϑΟϧλͷαΠζ͕༻ޠʹґଘ͠ͳ͍ • ཁૉͷՃɺཁૉͷ͍߹Θͤݻఆ࣌ؒͰ͢Ή • ͨͩ͠ɺཁૉͷ͍߹Θͤʹfalse positive͕ൃੜ͢Δ •
จॻ͝ͱʹϒϧʔϜϑΟϧλΛ࡞͠ɺ͜ͷू߹͔Β༻ޠؚ͕·ΕΔจॻΛݕ ࡧ͢Δ • ͜ͷεʔύʔվળ൛͕BingͷݕࡧΤϯδϯʹΘΕͨʢBitFunnelʣ[4][5] 15 શจݕࡧΤϯδϯͷߴԽʢϒϧʔϜϑΟϧλʣ <>#JOHݕࡧͷཪଆʕ#JU'VOOFMͷΞϧΰϦζϜ IUUQTEFWFMPQFSIBUFOBTUB⒎DPNFOUSZ <>#PC(PPEXJO .JDIBFM)PQDSPGU %BO-VV "MFY$MFNNFS .JIBFMB$VSNFJ 4BNFI&MOJLFUZ BOE:VYJPOH)F#JU'VOOFM3FWJTJUJOH4JHOBUVSFTGPS 4FBSDI*O1SPDFFEJOHTPGUIFUI*OUFSOBUJPOBM"$.4*(*3$POGFSFODFPO3FTFBSDIBOE%FWFMPQNFOUJO*OGPSNBUJPO3FUSJFWBM 4*(*3` "TTPDJBUJPOGPS $PNQVUJOH.BDIJOFSZ /FX:PSL /: 64" r%0*IUUQTEPJPSH -
• ͻͱͭͷϒϧʔϜϑΟϧλ Ϗοτͷྻ͔ΒΔ m 16 ϒϧʔϜϑΟϧλ 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 Bloom filter(m = 10) -
• ͻͱͭͷϒϧʔϜϑΟϧλ Ϗοτͷྻ͔ΒΔ • ཁૉ ݸͷϋογϡ͔ؔΒಘΒΕΔྻͷఴࣈҐஔͷू߹ʹม͞ΕΔ m k 17 ϒϧʔϜϑΟϧλʢཁૉͷՃʣ
H1 (element1 ) = 0 H2 (element1 ) = 9 element1 Hash function(k = 2) -
• ͻͱͭͷϒϧʔϜϑΟϧλ Ϗοτͷྻ͔ΒΔ • ཁૉ ݸͷϋογϡ͔ؔΒಘΒΕΔྻͷఴࣈҐஔͷू߹ʹม͞ΕΔ • ू߹શཁૉͷྻͷఴࣈͷू߹Λ1ͱ͢Δྻͱͯ͠දݱ͞ΕΔ m k
18 ϒϧʔϜϑΟϧλʢཁૉͷՃʣ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 H1 (element1 ) = 0 H2 (element1 ) = 9 element1 Bloom filter(m = 10) Hash function(k = 2) -
• ͻͱͭͷϒϧʔϜϑΟϧλ Ϗοτͷྻ͔ΒΔ • ཁૉ ݸͷϋογϡ͔ؔΒಘΒΕΔྻͷఴࣈҐஔͷू߹ʹม͞ΕΔ • ू߹શཁૉͷྻͷఴࣈͷू߹Λ1ͱ͢Δྻͱͯ͠දݱ͞ΕΔ m k
19 ϒϧʔϜϑΟϧλʢཁૉͷՃʣ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 H1 (element2 ) = 1 H2 (element2 ) = 9 element2 Bloom filter(m = 10) Hash function(k = 2) -
• ͍߹ΘͤΔཁૉʹରͯ͠kݸͷϋογϡ͔ؔΒಘΒΕͨఴࣈҐஔΛ͏ • ҰͭͰ0͕͋Εʮઈରʹʯؚ·Εͳ͍ 20 ϒϧʔϜϑΟϧλʢཁૉͷ͍߹Θͤʣ 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 1 H1 (element3 ) = 1 H2 (element3 ) = 8 element3 Bloom filter(m = 10) Hash function(k = 2) ❌ -
• ͍߹ΘͤΔཁૉʹରͯ͠kݸͷϋογϡ͔ؔΒಘΒΕͨఴࣈҐஔΛ͏ • ҰͭͰ0͕͋Εʮઈରʹʯؚ·Εͳ͍ • શͯ1ʹͳ͍ͬͯΕʮɹɹʯؚ·ΕΔ 21 ϒϧʔϜϑΟϧλʢཁૉͷ͍߹Θͤʣ 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 1 H1 (element1 ) = 0 H2 (element1 ) = 9 element1 Bloom filter(m = 10) Hash function(k = 2) ⭕ -
• ͍߹ΘͤΔཁૉʹରͯ͠kݸͷϋογϡ͔ؔΒಘΒΕͨఴࣈҐஔΛ͏ • ҰͭͰ0͕͋Εʮઈରʹʯؚ·Εͳ͍ • શͯ1ʹͳ͍ͬͯΕʮଟʯؚ·ΕΔ 22 ϒϧʔϜϑΟϧλʢཁૉͷ͍߹Θͤʣ 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 1 H1 (element4 ) = 0 H2 (element4 ) = 1 element4 Bloom filter(m = 10) Hash function(k = 2) ❓ -
• ܰྔ • ΠϯσοΫεͷαΠζ͕খ͍͞΄ͲಡΈࠐΈʢ͍߹Θͤͷىಈʣ͕͍ • ߴ • ߏங࣌: ߴʹΠϯσοΫεߏங͕Ͱ͖Εݕࡧରෛ୲ͳ͘ै •
ݕࡧ࣌: ߴʹ͍߹Θ͕ͤͰ͖Εશจݕࡧશମͷ࣮࣌ؒΛॖ • ൚༻ • ಛఆͷπʔϧʹґଘͤͣɺΈ߹Θͤͯར༻Մೳʹ͢Δ͜ͱͰ༗༻ੑ্͕ 24 શจݕࡧπʔϧʹ͓͚ΔΠϯσοΫεػߏͷཁ݅ -
• ܰྔ / ߴ • ϒϧʔϜϑΟϧλΛ༻͍Δ • αΠζ͕༻ޠʹґଘͤͣɺ͍߹Θ͕ͤݻఆ࣌ؒͰࡁΉಛੑΛར༻ • ൚༻
• ΠϯσοΫεΛݕࡧ͠ɺ֘͢ΔΩʔϫʔυؚ͕·ΕΔϑΝΠϧҰཡΛฦ͢ ίϚϯυΛఏڙ͢Δ • ҙͷશจݕࡧπʔϧҰཡΛArgsͱͯ͠શจݕࡧΛߦ͏ • ِཅੑʹΑΔޡݕग़શจݕࡧπʔϧʹΑͬͯϑΟϧλ͞ΕΔ 25 શจݕࡧπʔϧʹ͓͚ΔΠϯσοΫεػߏͷݕ౼ -
• A lightweight index for full text search tools using
bloom filter. [6] • ఏҊख๏ͷGo࣮ʢWIPʣ • “sifter"ྉཧ༻ͷ;Δ͍ɺͱ͔ɺબΓ͚Δਓɺͷҙ 26 monochromegane/sifter <>NPOPDISPNFHBOFTJGUFS IUUQTHJUIVCDPNNPOPDISPNFHBOFTJGUFS -
• σΟϨΫτϦԼͷςΩετϑΝΠϧʹରͯͦ͠ΕͧΕϒϧʔϜϑΟϧλΛੜ ͢ΔʢϑΝΠϧ * m bitʣ • ࣄલʹݕࡧΩʔϫʔυ͕ෆ໌ɺ͔ͭτʔΫϯԽ͕͍͠ຊޠؚ·ΕΔ͜ͱ ͔Βɺn-gramΛ࠾༻ͨ͠ʢ࠷େ3-gramʣ 27
monochromegane/sifter $ sifter -m 5 -k 3 build 1, 1, 0, 0, 0 func init() { fun unc nc_ c_i Hk -
• ͍߹Θͤ࣌ʹɺશͯͷϒϧʔϜϑΟϧλΛಡΈࠐΉඞཁ͕͋ΔͨΊɺBit- sliced signatureԽ͢Δ͜ͱͰಡΈࠐΉσʔλΛݮ͠ɺߴԽ͢Δ 28 monochromegane/sifter $ sifter -m 5
-k 3 build 1, 1, 0, 0, 0 1, 0, 1, 0, 0 1, 0, 0, 1, 0 H1 = 4 & 00001 & 00001 & 00001 શͯͷϒϧʔϜϑΟϧλʹ ର͍ͯ͠߹Θ͕ͤൃੜ -
• ͍߹Θͤ࣌ʹɺશͯͷϒϧʔϜϑΟϧλΛಡΈࠐΉඞཁ͕͋ΔͨΊɺBit- sliced signatureԽ͢Δ͜ͱͰಡΈࠐΉσʔλΛݮ͠ɺߴԽ͢Δ 29 monochromegane/sifter $ sifter -m 5
-k 3 build 1, 1, 0, 0, 0 1, 0, 1, 0, 0 1, 0, 0, 1, 0 H1 = 4 & 00001 & 00001 & 00001 ࣮࣭ɺఴࣈͷ෦͔ͬ͠ ͯͳͦ͞͏ -
• ͍߹Θͤ࣌ʹɺશͯͷϒϧʔϜϑΟϧλΛಡΈࠐΉඞཁ͕͋ΔͨΊɺBit- sliced signatureԽ͢Δ͜ͱͰಡΈࠐΉσʔλΛݮ͠ɺߴԽ͢Δ 30 monochromegane/sifter $ sifter -m 5
-k 3 build 1, 1, 0, 0, 0 1, 0, 1, 0, 0 1, 0, 0, 1, 0 1, 1, 1 1, 0, 0 0, 1, 0 0, 0, 1 0, 0, 0 H1 = 4 ֘͢ΔఴࣈͷΈΛूΊΔ ʢϒϧʔϜϑΟϧλͷू߹ ΛߦྻͱݟΔͱసஔͨ͠ܗ ʹ૬ʣ ∣ F ∣ m m ∣ F ∣ -
• ͍߹Θͤ࣌ʹɺશͯͷϒϧʔϜϑΟϧλΛಡΈࠐΉඞཁ͕͋ΔͨΊɺBit- sliced signatureԽ͢Δ͜ͱͰಡΈࠐΉσʔλΛݮ͠ɺߴԽ͢Δ 31 monochromegane/sifter $ sifter -m 5
-k 3 build 1, 1, 0, 0, 0 1, 0, 1, 0, 0 1, 0, 0, 1, 0 1, 1, 1 1, 0, 0 0, 1, 0 0, 0, 1 0, 0, 0 & 111 H1 = 4 ֘͢ΔఴࣈͷΈΛूΊͨ ෦͚ͩʹ͍߹ΘͤΕ ྑ͍ -
• ͍߹Θͤ࣌ύλʔϯจࣈྻΛ3-gramԽ͠ɺͦΕͧΕͷϋογϡ͔ؔΒ ಘΒΕͨఴࣈͷू߹Λ͍ͬͯ߹ΘͤΛߦ͏ 32 monochromegane/sifter $ sifter -m 5 -k
3 find PATTERN 1, 1, 1 1, 0, 0 0, 1, 0 0, 0, 1 0, 0, 0 & 111 1, 1, 0, 0, 0 PATTERN PAT ATT TER ERN Hk & 111 ൪ͷϑΝΠϧʹ ʮଟʯؚ·ΕͯΔ ൪ͷϑΝΠϧʹରԠ ͢ΔϑΝΠϧ໊Λग़ྗ ⭕❌ ❌ -
• શจݕࡧπʔϧsifterʹΑͬͯߜΓࠐ·ΕͨީิͷΈ͔ΒશจݕࡧΛߦ͏ • ِཅੑʹΑΔޡݕग़શจݕࡧπʔϧʹΑͬͯϑΟϧλ͞ΕΔ • ِӄੑʹΑΔޡݕग़ൃੜ͠ͳ͍ͷͰݕࡧ࿙Εൃੜ͠ͳ͍ 33 monochromegane/sifter $ pt
PATTERN `sifter -m 5 -k 3 find PATTERN` -
35 ධՁ • ൚༻ • શจݕࡧπʔϧͱΈ߹Θͤͨॲཧ࣌ؒͷॖ • ܰྔ • ΠϯσοΫεͷαΠζ
• ߴ • ͍߹Θͤͷ࣌ؒ • ΠϯσοΫεߏஙͷ࣌ؒ -
• CentOS Linux release 8.1.1911 (Core) on Vagrant • CPU:
4, Memory: 5,120MB • https://github.com/torvalds/linux (c578ddb) • ૯ϑΝΠϧ: 67,947 • ϒϧʔϜϑΟϧλ( ) k = 3, m = 10,000 36 ධՁڥ -
• ݕࡧΩʔϫʔυ: ‘GPL-2.0-or-later' (8,168/67,947 = 12%) 37 ධՁ: શจݕࡧπʔϧͱͷΈ߹Θͤ Ωϟογϡͳ͠
ඵ Ωϟογϡ͋Γ ඵ HSFQ HSFQ TJGUFS QU QU TJGUFS ఏҊख๏ʹΑΔݕࡧରͷࣄલߜΓࠐΈ ʹΑͬͯɺTJGUFSͷ࣮ߦ࣌ؒΛࠩ͠Ҿ͍ͯ ɺશମͱͯ͠େ෯ͳݕࡧͷվળ͕ ֬ೝͰ͖ͨɻͳ͓ɺTJGUFS ݅ͷީ ิΛTTͰฦ͍ͯ͠Δɻ -
• ݕࡧΩʔϫʔυ: ‘GPL-2.0-or-later' (8,168/67,947 = 12%) 38 ධՁ: શจݕࡧπʔϧͱͷΈ߹Θͤ Ωϟογϡͳ͠
ඵ Ωϟογϡ͋Γ ඵ HSFQ HSFQ TJGUFS QU QU TJGUFS Ωϟογϡͳ͠ ඵ Ωϟογϡ͋Γ ඵ HSFQ HSFQ TJGUFS QU QU TJGUFS • ݕࡧΩʔϫʔυ: ‘#define BYT_RT5640_MAP(quirk)' (2/67,947 = 0.003%) ఏҊख๏ʹΑΔࣄલͷߜΓࠐΈͷޮՌ͕ߴ ͍߹ʹɺΑΓݦஶͳ࣮ߦ࣌ؒͷॖ͕ ֬ೝ͞ΕͨʢTJGUFS݅TTʣ ͳ͓ɺૉͷQUͷվળύλʔϯʹ߹க͠ͳ ͚Εਫ਼ࠪ͠ͳ͍࣮ͷʹΑΔ -
• 67,947bit=8,494byte*10,000=84.94MB • du -h linux 1.2G • શମͱͯ͠ϦϙδτϦͷαΠζͱൺֱͯ͠ेʹখ͍͞ •
͍߹Θͤ࣌ʹ k*8,494byte ͷΈͷಡΈࠐΈͰࡁΉ 39 ධՁ: ΠϯσοΫεͷαΠζ -
• ݱࡏɺ1.2G ͷϦϙδτϦʹରͯ͠20ఔ͔͔Δ͜ͱ͔Βվળ͕ඞཁ… • ϘτϧωοΫϋογϡؔ [7][8] • 1จࣈʹରͯ͠{1,2,3}-gram*k(3)ճͷϋογϡ͕࣮ؔߦ͞ΕΔ (=0.01ms) •
98KbͷϑΝΠϧͰ͓͓Αͦ1s͔͔Δܭࢉ • ΠϯσοΫεߏஙͷߴԽʹ͚ͯɺϋογϡ݁ՌͷΩϟογϡɺߴͳ ϋογϡؔ[9]ͷద༻ɺޮతͳτʔΫϯԽͷݕ౼ͳͲ͕ඞཁ gi (x) = h1 (x) + ih2 (x) mod m 40 ධՁ: ΠϯσοΫεͷߏங <>,JSTDI "EBN BOE.JDIBFM.JU[FONBDIFS-FTTIBTIJOH TBNFQFSGPSNBODFCVJMEJOHBCFUUFSCMPPNpMUFS&VSPQFBO4ZNQPTJVNPO"MHPSJUINT 4QSJOHFS #FSMJO )FJEFMCFSH <>(PMBOHͰ#MPPN'JMUFSΛ࣮ͯ͠Έͨ IUUQTDJQFQTFSIBUFOBCMPHDPNFOUSZ <>.VSNVS)BTI IUUQTUBOKFOUMJWFKPVSOBMDPNIUNM -
• શจݕࡧπʔϧͰར༻Ͱ͖Δܰྔɾߴɾ൚༻ͳΠϯσοΫεػߏΛఏҊͨ͠ • ϒϧʔϜϑΟϧλΛ࠾༻͢Δ͜ͱͰܰྔ͔͍ͭ߹ΘͤͷߴԽΛ࣮ݱͨ͠ • ީิͷΈΛฦ٫͢ΔผπʔϧΛఏڙ͢Δ͜ͱͰ൚༻ੑΛߴΊͨ • ҰํͰɺϋογϡؔͷ࣮ߦ͕࣌ؒϘτϧωοΫͱͳΓେنͳϦϙδτϦʹ ର͢ΔΠϯσοΫεͷߏஙʹ͕͔͔࣌ؒΔͨΊࠓޙͷվળ͕ඞཁ •
ࠓޙɺ͍߹ΘͤࣗମʹΦʔόϔου͕ൃੜ͢ΔΞʔΩςΫνϟ[10]ͱͷ࿈ܞ ݕ౼͢Δ͜ͱͰWebγεςϜͷݚڀΛൃల͍ͤͨ͞ 42 ·ͱΊ <>Ѩ෦ത ౡܚҰ ٶຊେี ؔ୩༐࢘ ੴݪ༸ Ԭా தଜྒྷ দӜ࢙ ࣰాཅҰ࣌ؒ࣠ݕࡧʹ࠷దԽͨ͠εέʔϧΞτՄೳͳߴϩάݕࡧΤϯδϯͷ࣮ݱͱධ Ձใॲཧֶձจࢽ 7PM /P QQr