2019 幎ã®ç§ãMail.ru Cloud iOS ããŒã ã§åŸ
æã®ã€ãã³ããéå¬ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæ°žç¶çã«ä¿åããããã®ã¡ã€ã³ ããŒã¿ããŒã¹ã¯ãã¢ãã€ã«äžçã«ãšã£ãŠéåžžã«çãããã®ã«ãªã£ãŠããŸãã
ããŒãžå 容
å®è£ ã®åæ© LMDBã®äœçœ®æ±ºã XNUMX é ã®ã¯ãžã© LMDB
3.1.ã¯ãžã©ãã®ïŒã ã¡ã¢ãªãããããããã¡ã€ã«
3.2.ã¯ãžã©ãã®ïŒã B+ããªãŒ
3.3.ã¯ãžã©ãã®ïŒã ã³ããŒãªã³ã©ã€ã Key-Value API ã«åºã¥ãããŒã¿ ã¹ããŒãã®èšèš
4.1.åºæ¬çãªæœè±¡å
4.2.ããŒãã«ã¢ããªã³ã°
4.3.ããŒãã«éã®é¢ä¿ã®ã¢ãã«å
1. å°å ¥åæ©
2015 幎ã«å¹Žã« XNUMX åãã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¿ãŒãã§ãŒã¹ãã©ã®ãããã®é »åºŠã§é
延ããããšããææšãåé€ããŸããã ç§ãã¡ã¯ããããã ãã£ãã ãã§ã¯ãããŸããã ãã¿ã³ãæŒãããªãããªã¹ããã¹ã¯ããŒã«ããªããªã©ãã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å¿çããªããªãå Žåããããšããäºå®ã«é¢ããèŠæ
ãå¢ããŠããŸãã 枬å®ã®ä»çµã¿ã«ã€ããŠ
枬å®çµæã¯ç§ãã¡ã«ãšã£ãŠå·æ°Žã·ã£ã¯ãŒãšãªããŸããã ããªãŒãºã«ãã£ãŠåŒãèµ·ããããåé¡ã¯ãä»ã®åé¡ãããã¯ããã«å€ãããšãå€æããŸããã ãã®äºå®ã«æ°ã¥ãåã«ãå質ã®äž»èŠãªãã¯ãã«ã«ææšãã¯ã©ãã·ã¥ããªãŒã ã£ãå ŽåãçŠç¹ãåœãŠãããåŸã¯ã
æ§ç¯ãã
ã·ã¹ãã çµç¹ã®ã¢ã¯ã¿ãŒ ã¢ãã«ã¯ããã«ãã¹ã¬ããããã® XNUMX çªç®ã®æ¬è³ªã«ãªãããšãåæãšããŠããŸãã ãã®äžã®ã¢ãã«ãªããžã§ã¯ãã¯ã¹ã¬ããã®å¢çãè¶ããããšã奜ã¿ãŸãã ãããŠã圌ãã¯ãããæã ãããã€ãã®å Žæã§è¡ãã®ã§ã¯ãªããã»ãŒåžžã«ãã©ãã§ãè¡ããŸãã
ããŒã¿ããŒã¹ã¯ãæ瀺ãããå³ã®åºç€ãšãªãã³ã³ããŒãã³ãã® XNUMX ã€ã§ãã ãã®äž»ãªã¿ã¹ã¯ã¯ãã¯ã ãã¿ãŒã³ãå®è£
ããããšã§ãã
ããŒã¿ããŒã¹ã®éžæã«åœ±é¿ãäžãã XNUMX çªç®ã®éèŠãªèŠçŽ ã¯ãã¯ã©ãŠã API ã§ããã ããã¯ãåæã«å¯Ÿãã git ã¢ãããŒãããã€ã³ã¹ãã¬ãŒã·ã§ã³ãåŸããã®ã§ãã 圌ã®ããã«ç§ãã¡ãç®æããã®ã¯
ãããã£ãŠããã« ã³ãã³ããå®è¡ãããšãã«ãããŒã«ã« ã¹ãããã·ã§ããã«ããããé©çšããã®ã§ã¯ãªãããã®å®å šãªç¶æ ããµãŒããŒå šäœã®ç¶æ ãšæ¯èŒãã git ãæ³åãããšãåæã®ä»çµã¿ã«ã€ããŠããªãæ£ç¢ºã«ç解ã§ããã§ããããã¯ã©ãŠãã¯ã©ã€ã¢ã³ãã§çºçããŸãã ãã®å®è£ ã«ã¯ããã¹ãŠã®ãµãŒã㌠ãã¡ã€ã«ãšããŒã«ã« ãã¡ã€ã«ã«é¢ããã¡ã¿æ å ±ãå«ã 500 ã€ã® DOM ããªãŒãã¡ã¢ãªã«å²ãåœãŠãå¿ èŠãããããšã¯å®¹æã«æšæž¬ã§ããŸãã ãŠãŒã¶ãŒã 1 äžåã®ãã¡ã€ã«ãã¯ã©ãŠãã«ä¿åããŠããå Žåããããåæããã«ã¯ãXNUMX äžããŒããæ〠XNUMX ã€ã®ããªãŒãåäœæããŠç Žæ£ããå¿ èŠãããããšãããããŸããã ãã ããåããŒãã¯ãµããªããžã§ã¯ãã®ã°ã©ããå«ãéåäœã§ãã ãã®èŠ³ç¹ããããããã¡ã€ãªã³ã°ã®çµæã¯äºæ³éãã§ããã ããŒãž ã¢ã«ãŽãªãºã ãèæ ®ããªããŠããèšå€§ãªæ°ã®å°ããªãªããžã§ã¯ããäœæããŠç Žæ£ããæé èªäœã«ããªãã®è²»çšããããããšãå€æããŸãããåºæ¬çãªåææäœãå€æ°ã®ãªããžã§ã¯ãã«å«ãŸããŠãããšããäºå®ã«ãããç¶æ³ã¯ããã«æªåããŠããŸãããŠãŒã¶ãŒã¹ã¯ãªããã®ã ãã®çµæãããŒã¿ããŒã¹ãéžæããéã® XNUMX çªç®ã®éèŠãªåºæºãã€ãŸããªããžã§ã¯ããåçã«å²ãåœãŠãã« CRUD æäœãå®è£ ã§ããæ©èœãä¿®æ£ãããŸããã
ä»ã®èŠä»¶ã¯ããäŒçµ±çãªãã®ã§ããã®å®å šãªãªã¹ãã¯æ¬¡ã®ãšããã§ãã
- ã¹ã¬ããã®å®å šæ§ã
- ãã«ãããã»ãã·ã³ã°ã åãããŒã¿ããŒã¹ ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãã¹ã¬ããéã ãã§ãªããã¡ã€ã³ ã¢ããªã±ãŒã·ã§ã³ãš iOS æ¡åŒµæ©èœã®éã§ãç¶æ ãåæããããšããèŠæã«ãã£ãŠæ±ºãŸããŸãã
- ä¿åããããšã³ãã£ãã£ãå€æŽäžå¯èœãªãªããžã§ã¯ããšããŠè¡šãæ©èœã
- CRUD æäœå ã§ã®åçå²ãåœãŠã®æ¬ åŠã
- åºæ¬ããããã£ã®ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒã
ACID ããŒã¯ãŒã: ååæ§ãäžè²«æ§ãåé¢æ§ãä¿¡é Œæ§ã - æã人æ°ã®ããã±ãŒã¹ãã¹ããŒãã¢ããããŸãã
ãã®äžé£ã®èŠä»¶ãèæ
®ãããšãSQLite ã¯ä»ãæãåªããéžæè¢ã§ãã ãããã代æ¿æ¡ãæ€èšããäžã§ãããæ¬ã«åºäŒããŸããã
2. LMDBã®äœçœ®ä»ã
LMDB ã¯ãããŒã¿ããŒã¹ã®æãäœãåºæ¬å±€ã§ããã¹ãã¬ãŒãžãå®è£ ãããéåžžã«å°ãã (ããã 10K è¡) ã©ã€ãã©ãªã§ãã
äžã®å³ã¯ãLMDB ãšããã«é«ãã¬ãã«ãå®è£
ãã SQLite ãæ¯èŒããããšã¯ãéåžžãSQLite ãš Core Data ãããæ£ç¢ºã§ã¯ãªãããšã瀺ããŠããŸãã BerkeleyDBãLevelDBãSophiaãRocksDB ãªã©ãåãã¹ãã¬ãŒãž ãšã³ãžã³ãåçã®ç«¶åä»ç€ŸãšããŠæããæ¹ãå
¬å¹³ã§ããããLMDB ã SQLite ã®ã¹ãã¬ãŒãž ãšã³ãžã³ ã³ã³ããŒãã³ããšããŠæ©èœããéçºãããããŸãã 2012幎ã«åããŠãã®ãããªå®éšãè¡ããã
LMDB ã®äž»ãªçšéã¯ãã¢ããªã±ãŒã·ã§ã³ ããŒã¿ããŒã¹ã®ãšã³ãžã³ãšããŠã§ãã ã©ã€ãã©ãªã®å€èŠ³ã¯éçºè
ã®ãããã§ã
LMDB ã¯ããã®ãŸãŸã®ã¹ãã¬ãŒãžãšããŠããã䜿çšãããŸãã ããšãã°ãMozilla Firefox ãã©ãŠã¶ãŒ
ãã®ãšã³ãžã³ã¯ã¢ãã€ã«éçºã®äžçã§ã人æ°ãåããŸããã 䜿çšã®çè·¡ãæ®ãå¯èœæ§ããããŸã
LMDB ã¯ãOracle ã®ç®¡çäžãžã®ç§»è¡åŸãBerkeleyDB ãæ®ããããããªåéã§ãæ¥ã®åœããå Žæãããã£ãŠéŠå°ŸããæŠã£ãŠããŸãã ãã®ã©ã€ãã©ãªã¯ãåãçš®é¡ã®ã©ã€ãã©ãªãšæ¯èŒããŠãããã®é床ãšä¿¡é Œæ§ã§æãããŠããŸãã ãåç¥ã®ãšãããç¡æã®ã©ã³ãã¯ãããŸãããLMDB ãš SQLite ã®ã©ã¡ããéžæãããã«ã€ããŠã¯ããã¬ãŒããªãã«çŽé¢ããå¿
èŠãããããšã匷調ããããšæããŸãã äžã®å³ã¯ãé«éåãã©ã®ããã«éæãããããæ確ã«ç€ºããŠããŸãã ãŸãããã£ã¹ã¯ ã¹ãã¬ãŒãžäžã®è¿œå ã®æœè±¡åã¬ã€ã€ãŒã«å¯ŸããŠæéãæ¯æãå¿
èŠã¯ãããŸããã ãã¡ãããåªããã¢ãŒããã¯ãã£ã§ã¯ãäŸç¶ãšããŠããããªãã§ã¯æãç«ã¡ãŸãããå¿
ç¶çã«ã¢ããªã±ãŒã·ã§ã³ ã³ãŒãã«ãããã衚瀺ãããŸãããã¯ããã«èããªããŸãã SQL èšèªã§ã®ã¯ãšãªã®ãµããŒããªã©ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠã®ãªãæ©èœã¯åããŠããŸããã 第 XNUMX ã«ãã¢ããªã±ãŒã·ã§ã³ã®æäœãšãã£ã¹ã¯ ã¹ãã¬ãŒãžãžã®ãªã¯ãšã¹ãã®ãããã³ã°ãæé©ã«å®è£
ã§ããããã«ãªããŸãã SQLiteã®å Žå
3. XNUMX é ã®ã¯ãžã© LMDB
LMDB ã俯ç°çã«èŠãåŸã¯ãããã«æ·±ãèŠãŠãããŸãããã 次㮠XNUMX ã€ã®ã»ã¯ã·ã§ã³ã§ã¯ãã¹ãã¬ãŒãž ã¢ãŒããã¯ãã£ã®åºç€ãšãªãäž»ãªèŠçŽ ã®åæã«å°å¿µããŸãã
- ãã£ã¹ã¯ãæäœããå éšããŒã¿æ§é ãåæããããã®ã¡ã«ããºã ãšããŠã®ã¡ã¢ãª ããã ãã¡ã€ã«ã
- ä¿åãããããŒã¿æ§é ã®çµç¹ãšããŠã® B+ ããªãŒã
- ACID ãã©ã³ã¶ã¯ã·ã§ã³ ããããã£ãšãã«ãããŒãžã§ã³ç®¡çãæäŸããã¢ãããŒããšããŠã®ã³ããŒãªã³ã©ã€ãã
3.1. ã¯ãžã©ãã®ïŒã ã¡ã¢ãªãããããããã¡ã€ã«
ã¡ã¢ãªãããããããã¡ã€ã«ã¯ããªããžããªã®ååã«ã䜿çšãããã»ã©éèŠãªã¢ãŒããã¯ãã£èŠçŽ ã§ãã ä¿åãããæ å ±ãžã®ã¢ã¯ã»ã¹ã®ãã£ãã·ã¥ãšåæã®åé¡ã¯ãå®å šã«ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®å€æã«å§ããããŸãã LMDB èªäœã«ã¯ãã£ãã·ã¥ãå«ãŸããŸããã ãããããããã¡ã€ã«ããããŒã¿ãçŽæ¥èªã¿åãããšã§ããšã³ãžã³ã®å®è£ ã§å€ãã®éšåãçç¥ã§ãããããããã¯äœæè ã«ããæèçãªæ±ºå®ã§ãã 以äžã¯ããããã®äžéšã®å®å šãªãªã¹ãã§ã¯ãããŸããã
- è€æ°ã®ããã»ã¹ããã¹ãã¬ãŒãžå ã®ããŒã¿ãæäœããå Žåããã®ããŒã¿ã®äžè²«æ§ãç¶æããã®ã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®è²¬ä»»ã«ãªããŸãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ããã®ã¡ã«ããºã ã«ã€ããŠç»åã䜿çšããŠè©³çŽ°ã«èª¬æããŸãã
- ãã£ãã·ã¥ãååšããªããããLMDB ã¯åçå²ãåœãŠã«é¢é£ãããªãŒããŒãããããå®å šã«è§£æŸãããŸãã å®éã®ããŒã¿ã®èªã¿åããšã¯ããã€ã³ã¿ãä»®æ³ã¡ã¢ãªå ã®æ£ããã¢ãã¬ã¹ã«èšå®ããããšã ãã§ããããã以äžã®ãã®ã§ã¯ãããŸããã 空æ³ã®ããã«èãããŸããããªããžã㪠ãœãŒã¹ã§ã¯ããã¹ãŠã® calloc åŒã³åºãããªããžããªæ§æé¢æ°ã«éäžããŠããŸãã
- ãã£ãã·ã¥ããªããšããããšã¯ããã£ãã·ã¥ã«ã¢ã¯ã»ã¹ããããã®åæã«é¢é£ããããã¯ããªãããšãæå³ããŸãã åæã«ä»»æã®æ°ã®ãªãŒããŒãååšã§ããŸãããããŒã¿ã«ã¢ã¯ã»ã¹ããéäžã§åäžã®ãã¥ãŒããã¯ã¹ã«ééããããšã¯ãããŸããã ãã®ãããèªã¿åãé床㯠CPU ã®æ°ã«é¢ããŠçæ³çãªç·åœ¢ã¹ã±ãŒã©ããªãã£ãæã¡ãŸãã LMDB ã§ã¯ãå€æŽæäœã®ã¿ãåæãããŸãã äžåºŠã«ååšã§ããã©ã€ã¿ãŒã¯ XNUMX 人ã ãã§ãã
- æå°éã®ãã£ãã·ã¥ãšåæããžãã¯ã«ããããã«ãã¹ã¬ããç°å¢ã§ã®äœæ¥ã«é¢é£ããéåžžã«è€éãªã¿ã€ãã®ãšã©ãŒããã³ãŒããç¯çŽã§ããŸãã Usenix OSDI 2014 ã«ã³ãã¡ã¬ã³ã¹ã§ã¯ãXNUMX ã€ã®èå³æ·±ãããŒã¿ããŒã¹ç 究ããããŸããã
ããã¹ãŠã®ãã¡ã€ã« ã·ã¹ãã ã¯åãããã«äœãããŠããããã§ã¯ãªã: ã¯ã©ãã·ã¥ ã³ã³ã·ã¹ãã³ããªã¢ããªã±ãŒã·ã§ã³ã®äœæã®è€éãã«ã€ããŠã О嚯楜ãšå©çã®ããã«ããŒã¿ããŒã¹ãæ·åãã ã ããããããLMDB ã®åäŸã®ãªãä¿¡é Œæ§ãšãåã SQLite ã§ãããäžåããã©ã³ã¶ã¯ã·ã§ã³ã® ACID ããããã£ã®ã»ãŒå®ç§ãªå®è£ ã®äž¡æ¹ã«é¢ããæ å ±ãåŸãããšãã§ããŸãã - LMDB ã®ããããªãºã ã«ãããã³ãŒãã®ãã·ã³è¡šçŸãããã»ããµã® L1 ãã£ãã·ã¥ã«å®å šã«é 眮ã§ããçµæãšããŠé床ç¹æ§ãåŸãããŸãã
æ®å¿µãªãããiOS ã§ã¯ãã¡ã¢ãª ãããããããã¡ã€ã«ã¯ç§ãã¡ãæãã»ã©ãã©è²ã§ã¯ãããŸããã ãããã«é¢é£ããæ¬ ç¹ã«ã€ããŠããæèçã«èªãã«ã¯ããã®ã¡ã«ããºã ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«å®è£ ããããã®äžè¬ååãæãåºãå¿ èŠããããŸãã
ã¡ã¢ãªãããããã¡ã€ã«ã«é¢ããäžè¬æ å ±
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¯ãå®è¡å¯èœãªã¢ããªã±ãŒã·ã§ã³ããšã«ãããã»ã¹ãšåŒã°ãããšã³ãã£ãã£ãé¢é£ä»ããŸãã åããã»ã¹ã«ã¯é£ç¶ããã¢ãã¬ã¹ç¯å²ãå²ãåœãŠãããåäœããããã«å¿ èŠãªãã®ãã¹ãŠãããã«é 眮ãããŸãã æäžäœã®ã¢ãã¬ã¹ã«ã¯ãã³ãŒããšããŒãã³ãŒããããããŒã¿ãšãªãœãŒã¹ãå«ãã»ã¯ã·ã§ã³ãå«ãŸããŸãã 次ã«ãããŒããšããŠããç¥ãããŠãããåçã¢ãã¬ã¹ç©ºéã®äžåãã«æé·ãããããã¯ãç¶ããŸãã ããã«ã¯ãããã°ã©ã ã®åäœäžã«è¡šç€ºããããšã³ãã£ãã£ã®ã¢ãã¬ã¹ãå«ãŸããŸãã äžçªäžã¯ãã¢ããªã±ãŒã·ã§ã³ ã¹ã¿ãã¯ã«ãã£ãŠäœ¿çšãããã¡ã¢ãªé åã§ãã 倧ãããªã£ãããå°ãããªã£ãããã€ãŸããã®å€§ããããã€ãããã¯ãªæ§è³ªãæã£ãŠããŸãã ã¹ã¿ãã¯ãšããŒããäºãã«æŒãåã£ããå¹²æžãããããªãããã«ãã¹ã¿ãã¯ãšããŒãã¯ã¢ãã¬ã¹ç©ºéã®ç°ãªã端ã§åé¢ãããŠãããäžéšãšäžéšã® XNUMX ã€ã®åçã»ã¯ã·ã§ã³ã®éã«ã¯ç©ŽããããŸãã ãã®äžéã»ã¯ã·ã§ã³ã®ã¢ãã¬ã¹ã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«ãã£ãŠããŸããŸãªãšã³ãã£ãã£ã®ããã»ã¹ã«é¢é£ä»ããããããã«äœ¿çšãããŸãã ç¹ã«ãç¹å®ã®é£ç¶ããã¢ãã¬ã¹ã®ã»ããããã£ã¹ã¯äžã®ãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã ãã®ãããªãã¡ã€ã«ã¯ã¡ã¢ãªãããã ãã¡ã€ã«ãšåŒã°ããŸãã
ããã»ã¹ã«å²ãåœãŠãããã¢ãã¬ã¹ç©ºéã¯èšå€§ã§ãã çè«çã«ã¯ãã¢ãã¬ã¹ã®æ°ã¯ãã€ã³ã¿ã®ãµã€ãºã«ãã£ãŠã®ã¿å¶éãããŸãããã€ã³ã¿ã®ãµã€ãºã¯ã·ã¹ãã ã®ããã深床ã«ãã£ãŠæ±ºãŸããŸãã ç©çã¡ã¢ãªã 1-in-1 ã§å²ãåœãŠãããŠããå Žåãæåã®ããã»ã¹ã RAM å šäœã䜿ãæããããã«ãã¿ã¹ã¯ãçºçããããšã¯çãã®äœå°ããããŸããã
ããããç§ãã¡ã¯çµéšãããææ°ã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã§ã¯åæã«å¿ èŠãªæ°ã®ããã»ã¹ãå®è¡ã§ããããšãç¥ã£ãŠããŸãã ããã¯ãçŽäžã®ããã»ã¹ã®ã¿ã«å€ãã®ã¡ã¢ãªãå²ãåœãŠããšããäºå®ã«ãã£ãŠå¯èœã«ãªããŸãããå®éã«ã¯ãçŸæç¹ã§å¿ èŠãªéšåã®ã¿ãã¡ã€ã³ã®ç©çã¡ã¢ãªã«ããŒããããŸãã ãããã£ãŠãããã»ã¹ã«é¢é£ä»ããããã¡ã¢ãªã¯ä»®æ³ãšåŒã°ããŸãã
ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¯ãä»®æ³ã¡ã¢ãªãšç©çã¡ã¢ãªãç¹å®ã®ãµã€ãºã®ããŒãžã«ç·šæããŸãã ä»®æ³ã¡ã¢ãªã®ç¹å®ã®ããŒãžãå¿ èŠã«ãªããšããã«ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¯ãããç©çã¡ã¢ãªã«ããŒããããããã®å¯Ÿå¿é¢ä¿ãç¹å¥ãªããŒãã«ã«æžã蟌ã¿ãŸãã 空ãã¹ãããããªãå Žåã¯ã以åã«ããŒããããããŒãžã® 0 ã€ããã£ã¹ã¯ã«ã³ããŒãããèŠæ±ãããããŒãžããã®ä»£ããã«ãªããŸãã ãã®æé ã«ã€ããŠã¯åŸã§èª¬æããŸãããã¹ã¯ããã³ã°ãšåŒã°ããŸãã 以äžã®å³ã¯ã説æãããŠããããã»ã¹ã瀺ããŠããŸãã ãã®äžã§ãã¢ãã¬ã¹ 4 ã®ããŒãž A ãããŒããããã¢ãã¬ã¹ 0 ã®ã¡ã€ã³ ã¡ã¢ãª ããŒãžã«é 眮ãããŸããããã®äºå®ã¯ãã»ã«çªå· XNUMX ã®å¯Ÿå¿è¡šã«åæ ãããŠããŸãã
ã¡ã¢ãªãããããããã¡ã€ã«ã®å Žåããç¶æ³ã¯ãŸã£ããåãã§ãã è«ççã«ã¯ããããã¯ä»®æ³ã¢ãã¬ã¹ç©ºéã«ç¶ç¶çãã€å®å
šã«é
眮ããããšèããããŸãã ãã ããç©çã¡ã¢ãªã«ã¯ããŒãžããšã«ããªã³ããã³ãã§ã®ã¿ã¢ã¯ã»ã¹ãããŸãã ãã®ãããªããŒãžã®å€æŽã¯ããã£ã¹ã¯äžã®ãã¡ã€ã«ãšåæãããŸãã ãããã£ãŠãã¡ã¢ãªå
ã®ãã€ããæäœããã ãã§ããã¡ã€ã« I/O ãå®è¡ã§ããŸãããã¹ãŠã®å€æŽã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«ãŒãã«ã«ãã£ãŠå
ã®ãã¡ã€ã«ã«èªåçã«è»¢éãããŸãã
â,war
以äžã®ç»åã¯ãç°ãªãããã»ã¹ããããŒã¿ããŒã¹ãæäœãããšãã« LMDB ãã©ã®ããã«ç¶æ
ãåæãããã瀺ããŠããŸãã ç°ãªãããã»ã¹ã®ä»®æ³ã¡ã¢ãªãåããã¡ã€ã«ã«ãããã³ã°ããããšã«ããããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã¯äºå®äžãã¢ãã¬ã¹ç©ºéã®ç¹å®ã®ãããã¯ãçžäºã«æšç§»çã«åæããããšã矩åä»ããããŸããããã LMDB ã®ç®çã§ãã
â,war
éèŠãªç¹ã¯ãLMDB ãæžã蟌ã¿ã·ã¹ãã ã³ãŒã« ã¡ã«ããºã ãéããŠããã©ã«ãã§ããŒã¿ ãã¡ã€ã«ãå€æŽãããã¡ã€ã«èªäœãèªã¿åãå°çšã¢ãŒãã§è¡šç€ºãããããšã§ãã ãã®ã¢ãããŒãã«ã¯ XNUMX ã€ã®éèŠãªæå³ããããŸãã
æåã®çµæã¯ããã¹ãŠã®ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«å
±éã§ãã ãã®æ¬è³ªã¯ãäžæ£ãªã³ãŒãã«ããããŒã¿ããŒã¹ãžã®äžæ³šæã«ããæå·ã«å¯Ÿããä¿è·ãè¿œå ããããšã§ãã ãåç¥ã®ãšãããããã»ã¹ã®å®è¡å¯èœåœä»€ã¯ãã¢ãã¬ã¹ç©ºéå
ã®ã©ãããã§ãããŒã¿ã«èªç±ã«ã¢ã¯ã»ã¹ã§ããŸãã åæã«ãå
ã»ã©æãåºããããã«ããã¡ã€ã«ãèªã¿åã/æžã蟌ã¿ã¢ãŒãã§è¡šç€ºãããšããããšã¯ãã©ã®åœä»€ã§ããã¡ã€ã«ãããã«å€æŽã§ããããšãæå³ããŸãã ããšãã°ãååšããªãã€ã³ããã¯ã¹ã«ããé
åèŠçŽ ãå®éã«äžæžãããããšãããªã©ã誀ã£ãŠãããè¡ã£ãå Žåããã®æ¹æ³ã§ãã®ã¢ãã¬ã¹ã«ããããããŠãããã¡ã€ã«ã誀ã£ãŠå€æŽããå¯èœæ§ããããããŒã¿ããŒã¹ã®ç Žæã«ã€ãªããå¯èœæ§ããããŸãã ãã¡ã€ã«ãèªã¿åãå°çšã¢ãŒãã§è¡šç€ºãããŠããå Žåãããã«å¯Ÿå¿ããã¢ãã¬ã¹ç©ºéãå€æŽããããšãããšãã·ã°ãã«ã«ããããã°ã©ã ã®ã¯ã©ãã·ã¥ãçºçããŸãã SIGSEGV
ããã¡ã€ã«ã¯ãã®ãŸãŸæ®ããŸãã
XNUMX çªç®ã®çµæã¯ããã§ã« iOS ã«åºæã®ãã®ã§ãã äœè ãä»ã®æ å ±æºãããã«ã€ããŠæ瀺çã«èšåããŠããŸããããããããªããã°ãLMDB ã¯ãã®ã¢ãã€ã« ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã§ã®å®è¡ã«ã¯é©ããŠããŸããã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ãã®èå¯ã«å°å¿µããŸãã
iOS ã®ã¡ã¢ãªãããããããã¡ã€ã«ã®è©³çŽ°
2018幎ã®WWDCã§ã¯çŽ æŽãããå ±åããããŸãã
ã¯ãªãŒã³ ã¡ã¢ãªã¯ãç©çã¡ã¢ãªããå®å
šã«ã¹ã¯ããã¢ãŠãã§ããããŒãžã®ã³ã¬ã¯ã·ã§ã³ã§ãã ãããã«å«ãŸããããŒã¿ã¯ãå¿
èŠã«å¿ããŠå
ã®ãœãŒã¹ããåããŒãã§ããŸãã èªã¿åãå°çšã®ã¡ã¢ãª ããã ãã¡ã€ã«ããã®ã«ããŽãªã«åé¡ãããŸãã iOS ã¯ããã¡ã€ã«ã«ããããããããŒãžããã£ã¹ã¯äžã®ãã¡ã€ã«ãšåæããŠããããšãä¿èšŒãããŠããããããã€ã§ãã¡ã¢ãªããã¢ã³ããŒãããããšãèºèºããŸããã
â,war
å€æŽããããã¹ãŠã®ããŒãžã¯ãå
ã®å Žæã«é¢ä¿ãªããããŒã㣠ã¡ã¢ãªã«å
¥ããŸãã ç¹ã«ãé¢é£ä»ããããä»®æ³ã¡ã¢ãªãžã®æžã蟌ã¿ã«ãã£ãŠå€æŽãããã¡ã¢ãª ãããã ãã¡ã€ã«ãããã®æ¹æ³ã§åé¡ãããŸãã ãã©ã°ã䜿çšã㊠LMDB ãéã MDB_WRITEMAP
å€æŽãå ããåŸã¯ãèªåã®ç®ã§ç¢ºèªã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãç©çã¡ã¢ãªãéå°ã«å æãå§ãããšããã«ãiOS ã¯ããŒã㣠ããŒãžãå§çž®ããŸãã ããŒã㣠ããŒãžãå§çž®ããŒãžã«ãã£ãŠå æãããŠããã¡ã¢ãªã®éåããããããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãª ãããããªã³ãã§ãã ç¹å®ã®ãããå€ã«éãããšãOOM ãã©ãŒ ã·ã¹ãã ããŒã¢ã³ãããã»ã¹ã®åŸã«æ¥ãŠåŒ·å¶çã«çµäºããŸãã ããã¯ããã¹ã¯ããã ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãšæ¯èŒãã iOS ã®ç¹æ®æ§ã§ãã å¯Ÿç §çã«ãç©çã¡ã¢ãªãããã£ã¹ã¯ã«ããŒãžãã¹ã¯ããããŠã¡ã¢ãªäœ¿çšéãåæžããæ©èœã¯ iOS ã«ã¯æäŸãããŠãããããã®çç±ã«ã€ããŠã¯æšæž¬ãããããããŸããã ãããããããŒãžããã£ã¹ã¯ã«éäžçã«ç§»åããããå ã«æ»ãããããæé ã¯ãã¢ãã€ã« ããã€ã¹ã«ãšã£ãŠãšãã«ã®ãŒæ¶è²»ãå€ãããããiOS ã SSD ãã£ã¹ã¯äžã®ã»ã«ãæžãæãããªãœãŒã¹ãç¯çŽããŠãããããããã¯ããã¹ãŠãæã£ãŠããã·ã¹ãã ã®å šäœçãªããã©ãŒãã³ã¹ã«èšèšè ãæºè¶³ããŠããªãã£ãå¯èœæ§ããããŸããåžžã«äº€æãããŠããŸãã ãããã«ãããäºå®ã¯å€ãããŸããã
è¯ããã¥ãŒã¹ã¯ããã§ã«åè¿°ããããã«ãLMDB ã¯ããã©ã«ãã§ã¯ãã¡ã€ã«ã®æŽæ°ã« mmap ã¡ã«ããºã ã䜿çšããªãããšã§ãã ãããã£ãŠãã¬ã³ããªã³ã°ãããããŒã¿ã¯ iOS ã«ãã£ãŠã¯ãªãŒã³ ã¡ã¢ãªãšããŠåé¡ãããã¡ã¢ãª ãããããªã³ãã«ã¯åœ±é¿ããŸããã ããã¯ãVM Tracker ãšåŒã°ãã Xcode ããŒã«ã䜿çšããŠç¢ºèªã§ããŸãã 以äžã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãåäœäžã® iOS ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã®ä»®æ³ã¡ã¢ãªã®ç¶æ ã瀺ããŠããŸãã éå§æã«ã¯ã2 ã€ã® LMDB ã€ã³ã¹ã¿ã³ã¹ãåæåãããŸããã 1 ã€ç®ã¯ãã¡ã€ã«ã 512 GiB ã®ä»®æ³ã¡ã¢ãªã«ãããããããšãã§ããXNUMX ã€ç®ã¯ XNUMXMiB ã§ããã ã©ã¡ãã®ã¹ãã¬ãŒãžãäžå®éã®åžžé§ã¡ã¢ãªãå æããŸãããã©ã¡ããããŒã㣠ãµã€ãºã«ã¯åœ±é¿ããŸããã
ããŠãæªããã¥ãŒã¹ã®æéã§ãã 64 ããã ãã¹ã¯ããã ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ã¹ã¯ãã ã¡ã«ããºã ã®ãããã§ãåããã»ã¹ã¯ãããŒã ãã£ã¹ã¯äžã®ç©ºãé åãã¹ã¯ããã®å¯èœæ§ã蚱容ããã®ãšåãã ãå€ãã®ä»®æ³ã¢ãã¬ã¹é åãå æããããšãã§ããŸãã iOS ã§ã¹ã¯ãããå§çž®ã«çœ®ãæãããšãçè«äžã®æ倧å€ã倧å¹
ã«æžå°ããŸãã çŸåšããã¹ãŠã®çããŠããããã»ã¹ã¯ã¡ã€ã³ (RAM èªã¿åã) ã¡ã¢ãªã«åãŸãå¿
èŠããããåãŸããªãããã»ã¹ã¯ãã¹ãŠåŒ·å¶çµäºã®å¯Ÿè±¡ãšãªããŸãã äžèšã®ããã«èšèŒãããŠããŸããã
ã¯ã©ãŠãã§ã®å®éšã®çµæãLMDB ã«ãã£ãŠå²ãåœãŠãããã¡ã¢ãªã®åŠ¥åå€ãšããŠã384 ããã ããã€ã¹ã®å Žå㯠32 ã¡ã¬ãã€ãã768 ããã ããã€ã¹ã®å Žå㯠64 ã¡ã¬ãã€ããèŠã€ãããŸããã ãã®ããªã¥ãŒã ã䜿ãæãããããšãã³ãŒãã«ããå€æŽæäœãå®äºãå§ããŸãã MDB_MAP_FULL
ã ã¢ãã¿ãªã³ã°ã§ã¯ãã®ãããªãšã©ãŒã芳å¯ãããŸããããã®æ®µéã§ã¯ç¡èŠã§ããã»ã©å°ãããã®ã§ãã
ã¹ãã¬ãŒãžã«ããéå°ãªã¡ã¢ãªæ¶è²»ã®æããã§ã¯ãªãçç±ãšããŠããã©ã³ã¶ã¯ã·ã§ã³ã®åç¶æéãé·ãããšãèããããŸãã ããã XNUMX ã€ã®çŸè±¡ãã©ã®ããã«é¢é£ããŠããããç解ããã«ã¯ãæ®ãã® XNUMX é ã® LMDB ã¯ãžã©ãèæ ®ããããšã圹ç«ã¡ãŸãã
3.2. ã¯ãžã©ãã®ïŒã B+ããªãŒ
ããŒ/å€ã¹ãã¢äžã§ããŒãã«ããšãã¥ã¬ãŒãããã«ã¯ããã® API ã«æ¬¡ã®æäœãååšããå¿ èŠããããŸãã
- æ°ããèŠçŽ ãæ¿å ¥ããŸãã
- æå®ãããããŒãæã€èŠçŽ ãæ€çŽ¢ããŸãã
- èŠçŽ ãåé€ããŸãã
- ãœãŒãé ã«ããŒééãç¹°ãè¿ããŸãã
XNUMX ã€ã®æäœãã¹ãŠãç°¡åã«å®è£ ã§ããæãåçŽãªããŒã¿æ§é ã¯ãäºåæ¢çŽ¢ããªãŒã§ãã ãã®åããŒãã¯ãåããŒã®ãµãã»ããå šäœã XNUMX ã€ã®ãµãããªãŒã«åå²ããããŒã§ãã å·ŠåŽã¯èŠªããå°ãããã®ãå³åŽã¯èŠªãã倧ãããã®ã§ãã é åºä»ããããããŒã®ã»ããã®ååŸã¯ãå€å žçãªããªãŒèµ°æ»ã® XNUMX ã€ãéããŠå®çŸãããŸãã
ãã€ã㪠ããªãŒã«ã¯ããã£ã¹ã¯ ããŒã¿æ§é ãšããŠã®å¹æã劚ãã XNUMX ã€ã®æ ¹æ¬çãªæ¬ ç¹ããããŸãã ãŸãããã®ãã©ã³ã¹ã®åºŠåããäºæž¬ã§ããªãã ããŸããŸãªæã®é«ãã倧ããç°ãªãå¯èœæ§ã®ããããªãŒãååŸããããšã«ã¯ããªãã®ãªã¹ã¯ããããããã«ãããäºæ³ããããã®ãšæ¯èŒããŠæ€çŽ¢ã®ã¢ã«ãŽãªãºã ã®è€éãã倧å¹
ã«æªåããŸãã 第äºã«ãããŒãéã®ã¯ãã¹ãªã³ã¯ãè±å¯ã§ããããããã€ã㪠ããªãŒã®ã¡ã¢ãªå
ã§ã®å±ææ§ã倱ããã(ããŒãéã®ãªã³ã¯ãšããç¹ã§) è¿ãããŒããä»®æ³ã¡ã¢ãªå
ã®ãŸã£ããç°ãªãããŒãžã«é
眮ãããå¯èœæ§ããããŸãã ãã®çµæãããªãŒå
ã®ããã€ãã®é£æ¥ããŒããåçŽã«èµ°æ»ããã ãã§ããåçã®æ°ã®ããŒãžã«ã¢ã¯ã»ã¹ããå¿
èŠãããå ŽåããããŸãã ããã»ããµ ãã£ãã·ã¥å
ã§ããŒãžãåžžã«å転ãããã®ã¯ã³ã¹ããããããªããããã¡ã¢ãªå
ããŒã¿æ§é ãšããŠã®ãã€ã㪠ããªãŒã®æå¹æ§ã«ã€ããŠè©±ãå Žåã§ããããã¯åé¡ã«ãªããŸãã ããŒãé¢é£ã®ããŒãžããã£ã¹ã¯ããé »ç¹ã«åŒã³åºããšãç¶æ³ã¯éåžžã«æªããªããŸãã
B ããªãŒã¯ãã€ã㪠ããªãŒã®é²åçã§ãããåã®æ®µèœã§ç¹å®ããåé¡ã解決ããŸãã 第äžã«ããããã¯èªå·±ãã©ã³ã¹ããšããŸãã 第 2 ã«ãåããŒãã¯åããŒã®ã»ããã XNUMX ã€ã§ã¯ãªããM åã®é åºä»ããµãã»ããã«åå²ããŸããM ãšããæ°ã¯ãæ°çŸãŸãã¯æ°åã®ãªãŒããŒãšéåžžã«å€§ãããªãå¯èœæ§ããããŸãã
ããã«ãã£ãŠïŒ
- åããŒãã«ã¯ãã§ã«é åºä»ããããå€æ°ã®ããŒããããããªãŒã¯éåžžã«äœããªããŸãã
- å€ãè¿ãããŒã¯èªç¶ã« XNUMX ã€ãŸãã¯é£æ¥ããããŒãäžã§äºãã«é£ãåã£ãŠé 眮ããããããããªãŒã¯ã¡ã¢ãªå ã§å±ææ§ã®ç¹æ§ãç²åŸããŸãã
- æ€çŽ¢æäœäžã«ããªãŒãäžéãããšãã«ééããŒãã®æ°ãæžãããŸãã
- åã¿ãŒã²ãã ããŒãã«ã¯ãã§ã«å€§éã®é åºä»ããããããŒãå«ãŸããŠãããããç¯å²ã¯ãšãªã§èªã¿åãããã¿ãŒã²ãã ããŒãã®æ°ãæžããŸãã
LMDB ã¯ãB+ ããªãŒãšåŒã°ãã B ããªãŒã®ããªã¢ã³ãã䜿çšããŠããŒã¿ãä¿åããŸãã äžã®å³ã¯ãããã«å«ãŸãã XNUMX çš®é¡ã®ããŒãã瀺ããŠããŸãã
- äžçªäžã«ããã®ãæ ¹ã§ãã ããã¯ããªããžããªå ã®ããŒã¿ããŒã¹ã®æŠå¿µãå ·äœåãããã®ã«ãããŸããã åäžã® LMDB ã€ã³ã¹ã¿ã³ã¹å ã«ãããããããä»®æ³ã¢ãã¬ã¹ç©ºéãå ±æããè€æ°ã®ããŒã¿ããŒã¹ãäœæã§ããŸãã ããããã¯ç¬èªã®ã«ãŒãããå§ãŸããŸãã
- æäžäœã¬ãã«ã¯è (ãªãŒã) ã§ãã ããŒã¿ããŒã¹ã«æ ŒçŽãããŠããããŒãšå€ã®ãã¢ãå«ãã®ã¯ããããã ãã§ãã ã¡ãªã¿ã«ããããB+-treeã®ç¹åŸŽã§ãã éåžžã® B ããªãŒããã¹ãŠã®ã¬ãã«ã®ããŒãã«å€éšåãæ ŒçŽããå ŽåãB+ å€åã¯æäžäœã®ããŒãã«ã®ã¿ååšããŸãã ãã®äºå®ãä¿®æ£ããã®ã§ã以äžã§ã¯ãLMDB ã§äœ¿çšãããããªãŒã®ãµãã¿ã€ããåã« B ããªãŒãšåŒã³ãŸãã
- ã«ãŒããšãªãŒãã®éã«ã¯ãããã²ãŒã·ã§ã³ (åå²) ããŒããæ〠0 å以äžã®æè¡ã¬ãã«ããããŸãã 圌ãã®ã¿ã¹ã¯ã¯ããœãŒããããããŒã®ã»ããããªãŒãéã§åå²ããããšã§ãã
ç©ççã«ã¯ãããŒãã¯æå®ã®é·ãã®ã¡ã¢ãªã®ãããã¯ã§ãã ãããã®ãµã€ãºã¯ãäžã§èª¬æãããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ã¡ã¢ãª ããŒãžã®ãµã€ãºã®åæ°ã§ãã ããŒãæ§é ã以äžã«ç€ºããŸãã ããããŒã«ã¯ã¡ã¿æ
å ±ãå«ãŸããŠããããã®äžã§æãæçœãªãã®ã¯ãããšãã°ãã§ãã¯ãµã ã§ãã 次ã«ãããŒã¿ãå«ãã»ã«ãäœçœ®ãããªãã»ããã«é¢ããæ
å ±ãç¶ããŸãã ããŒã¿ã®åœ¹å²ã¯ãããã²ãŒã·ã§ã³ ããŒãã«ã€ããŠè©±ããŠããå Žåã¯ããŒããŸãã¯ãªãŒãã®å Žåã¯ããŒãšå€ã®ãã¢å
šäœã®ããããã«ãªããŸããããŒãžã®æ§é ã«ã€ããŠã¯ãäœåã§è©³ããèªãããšãã§ããŸãã
ããŒãž ããŒãã®å éšã³ã³ãã³ããæ±ã£ãã®ã§ã次ã®åœ¢åŒã§ LMDB B ããªãŒãããã«ç°¡ç¥åããŠè¡šããŸãã
ããŒããå«ãããŒãžã¯ãã£ã¹ã¯äžã«é çªã«é 眮ãããŸãã çªå·ã倧ããããŒãžã»ã©ããã¡ã€ã«ã®çµããã«åãã£ãŠé 眮ãããŸãã ããããã¡ã¿ ããŒãž (ã¡ã¿ ããŒãž) ã«ã¯ããã¹ãŠã®ããªãŒã®ã«ãŒããèŠã€ããããã«äœ¿çšã§ãããªãã»ããã«é¢ããæ å ±ãå«ãŸããŠããŸãã ãã¡ã€ã«ãéããããšãLMDB ã¯æå¹ãªã¡ã¿ ããŒãžãæ¢ããŠãã¡ã€ã«ãããŒãžããšã«æåŸããæåãŸã§ã¹ãã£ã³ãããããéããŠæ¢åã®ããŒã¿ããŒã¹ãèŠã€ããŸãã
ããŒã¿æ§æã®è«ççããã³ç©ççæ§é ãç解ããã®ã§ãLMDB ã® XNUMX çªç®ã®ã¯ãžã©ã®æ€èšã«é²ãããšãã§ããŸãã ããã«ããããã¹ãŠã®ã¹ãã¬ãŒãžå€æŽããã©ã³ã¶ã¯ã·ã§ã³çã«çžäºã«åé¢ããŠå®è¡ãããããŒã¿ããŒã¹å šäœã«ãã«ãããŒãžã§ã³ç¹æ§ãäžããããŸãã
3.3. ã¯ãžã©ãã®ïŒã ã³ããŒãªã³ã©ã€ã
äžéšã® B ããªãŒæäœã«ã¯ããã®ããŒãã«å¯Ÿããäžé£ã®å€æŽå šäœãå«ãŸããŸãã äžäŸãšããŠããã§ã«æ倧容éã«éããŠããããŒãã«æ°ããããŒãè¿œå ããããšãæããããŸãã ãã®å ŽåããŸãããŒãã XNUMX ã€ã«åå²ãã次ã«ãã®èŠªããŒãã«æ°ããã¹ãã³ãªããããåããŒããžã®ãªã³ã¯ãè¿œå ããå¿ èŠããããŸãã ãã®æé ã¯æœåšçã«éåžžã«å±éºã§ãã äœããã®çç± (ã¯ã©ãã·ã¥ãåé»ãªã©) ã§ã·ãªãŒãºããã®å€æŽã®äžéšã®ã¿ãçºçããå ŽåãããªãŒã¯äžæŽåãªç¶æ ã®ãŸãŸã«ãªããŸãã
ããŒã¿ããŒã¹ããã©ãŒã«ã ãã¬ã©ã³ãã«ããããã®åŸæ¥ã®è§£æ±ºçã® XNUMX ã€ã¯ãè¿œå ã®ãã£ã¹ã¯ ããŒã¹ã®ããŒã¿æ§é ã§ãããã©ã³ã¶ã¯ã·ã§ã³ ãã° (WAL) ã B ããªãŒã®é£ã«è¿œå ããããšã§ãã ããã¯ãB ããªãŒèªäœãå€æŽãããçŽåã«ããã®æ«å°Ÿã«æå³ããæäœãèšè¿°ããããã¡ã€ã«ã§ãã ãããã£ãŠãèªå·±èšºæäžã«ããŒã¿ç Žæãæ€åºãããå ŽåãããŒã¿ããŒã¹ã¯ãã°ãåç §ããŠèªèº«ãã¯ãªãŒã³ã¢ããããŸãã
LMDB ã¯ããã©ãŒã«ã ãã¬ã©ã³ã¹ ã¡ã«ããºã ãšããŠãã³ã㌠ãªã³ ã©ã€ããšåŒã°ããå¥ã®æ¹æ³ãéžæããŸããã ãã®æ¬è³ªã¯ãæ¢åã®ããŒãžã®ããŒã¿ãæŽæ°ããã®ã§ã¯ãªãããŸãããŒãžå šäœãã³ããŒãããã®ã³ããŒå ã«ãã§ã«å«ãŸããŠãããã¹ãŠã®å€æŽãè¡ãããšã§ãã
ãŸããæŽæ°ãããããŒã¿ãå©çšã§ããããã«ããããã«ã¯ã芪ããŒãã«ãããŠææ°ã«ãªã£ãããŒããžã®ãªã³ã¯ãããã®ããŒãã«é¢é£ããŠå€æŽããå¿ èŠãããã ãã®ããã«ãä¿®æ£ãå¿ èŠãªã®ã§ããããäºåã«ã³ããŒãããŸãã ãã®ããã»ã¹ã¯ã«ãŒãã«è³ããŸã§ååž°çã«ç¶è¡ãããŸãã ã¡ã¿ ããŒãžäžã®ããŒã¿ã¯æåŸã«å€æŽãããŸãã
æŽæ°æé äžã«ããã»ã¹ãçªç¶ã¯ã©ãã·ã¥ããå Žåãæ°ããã¡ã¿ ããŒãžãäœæãããªãããæåŸãŸã§ãã£ã¹ã¯ã«æžã蟌ãŸããããã®ãã§ãã¯ãµã ãäžæ£ç¢ºã«ãªããŸãã ããã XNUMX ã€ã®ã±ãŒã¹ã®ãããã®å Žåããæ°ããããŒãžã«ã¯ã¢ã¯ã»ã¹ã§ããªããªããŸãããå€ãããŒãžã¯åœ±é¿ãåããŸããã ããã«ãããLMDB ãããŒã¿ã®äžè²«æ§ãç¶æããããã«ãã°ãå è¡æžã蟌ãå¿ èŠããªããªããŸãã å®éã«ã¯ãäžã§èª¬æãããã£ã¹ã¯äžã®ããŒã¿ ã¹ãã¬ãŒãžã®æ§é ãåæã«ãã®æ©èœãæãããŸãã æ瀺çãªãã©ã³ã¶ã¯ã·ã§ã³ ãã°ããªãããšã¯ãé«ãããŒã¿èªã¿åãé床ãæäŸãã LMDB ã®æ©èœã® XNUMX ã€ã§ãã
è¿œå å°çš B ããªãŒãšåŒã°ããçµæãšããŠåŸãããæ§é ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ãšãã«ãããŒãžã§ã³ç®¡çãèªç¶ã«æäŸããŸãã LMDB ã§ã¯ãéããŠããåãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯ãããã«é¢é£ä»ããããææ°ã®ããªãŒ ã«ãŒãããããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããªãéãããã©ã³ã¶ã¯ã·ã§ã³ã«é¢é£ä»ããããããªãŒã®ããŒãžãå€æŽãããããæ°ããããŒãžã§ã³ã®ããŒã¿ã«åå©çšããããããããšã¯ãããŸããããããã£ãŠããã©ã³ã¶ã¯ã·ã§ã³æã«é¢é£ããŠããããŒã¿ ã»ãããæ£ç¢ºã«å¥œããªã ãæäœã§ããŸãããã®æç¹ã§ã¹ãã¬ãŒãžãã¢ã¯ãã£ãã«æŽæ°ããç¶ããŠããå Žåã§ãããã©ã³ã¶ã¯ã·ã§ã³ããªãŒãã³ãããæç¹ã§ã ããããã«ãããŒãžã§ã³ç®¡çã®æ¬è³ªã§ãããLMDB ãç§ãã¡ã®æãã人ã«ãšã£ãŠçæ³çãªããŒã¿ãœãŒã¹ã«ããŸãã UICollectionView
ã ãã©ã³ã¶ã¯ã·ã§ã³ãéããåŸã¯ãäœãæ®ããªãããšãæããŠãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéãå¢ãããããçŸåšã®ããŒã¿ãã¡ã¢ãªå
ã®æ§é ã«æ¥ãã§éã蟌ãã ãããå¿
èŠã¯ãããŸããã ãã®æ©èœã¯ãLMDB ãããã®ãããªå®å
šãªåé¢ãèªãããšãã§ããªãåã SQLite ãšåºå¥ããŸãã åŸè
㧠XNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãéãããã®ãã¡ã® XNUMX ã€ã§ç¹å®ã®ã¬ã³ãŒããåé€ãããšãXNUMX çªç®ã«æ®ã£ããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯åãã¬ã³ãŒããååŸã§ããªããªããŸãã
ã³ã€ã³ã®è£è¿ããšããŠãä»®æ³ã¡ã¢ãªã®æ¶è²»éãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸãã ãã®ã¹ã©ã€ãã¯ãããŒã¿ããŒã¹ã®ç°ãªãããŒãžã§ã³ãåç §ãã 3 ã€ã®ãªãŒãã³èªã¿åããã©ã³ã¶ã¯ã·ã§ã³ãåæã«å€æŽããå Žåã«ãããŒã¿ããŒã¹æ§é ãã©ã®ããã«ãªããã瀺ããŠããŸãã LMDB ã¯å®éã®ãã©ã³ã¶ã¯ã·ã§ã³ã«é¢é£ä»ããããã«ãŒãããå°éå¯èœãªããŒããåå©çšã§ããªããããã¹ãã¬ãŒãžã«ã¯ã¡ã¢ãªå ã«å¥ã® XNUMX çªç®ã®ã«ãŒããå²ãåœãŠããã®äžã«å€æŽãããããŒãžãããäžåºŠè€è£œãã以å€ã«éžæè¢ã¯ãããŸããã
ããã§ãã¡ã¢ãª ãããã ãã¡ã€ã«ã«é¢ããã»ã¯ã·ã§ã³ãæãåºãã®ã¯äžå¿ èŠã§ã¯ãããŸããã ä»®æ³ã¡ã¢ãªã®è¿œå æ¶è²»ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãª ãããããªã³ãã«åœ±é¿ããªããããããŸãæ°ã«ããå¿ èŠã¯ãªãããã§ãã ãããåæã«ãiOS ã¯ãã®å²ãåœãŠãéåžžã«ã±ãã§ããããã¹ã¿ãŒã®è©ãããµãŒããŒãŸãã¯ãã¹ã¯ãããäžã« 1 ãã©ãã€ãã® LMDB é åãæäŸãããã®æ©èœã«ã€ããŠãŸã£ããèæ ®ããããšã¯ã§ããŸããã å¯èœã§ããã°ããã©ã³ã¶ã¯ã·ã§ã³ã®åç¶æéãã§ããã ãçãããããã«åªããŠãã ããã
4. Key-Value API ã«åºã¥ãããŒã¿ ã¹ããŒãã®èšèš
LMDB ãæäŸããåºæ¬çãªæœè±¡å (ç°å¢ãšããŒã¿ããŒã¹ãããŒãšå€ããã©ã³ã¶ã¯ã·ã§ã³ãšã«ãŒãœã«) ãèŠãŠ API ã®è§£æãå§ããŸãããã
ã³ãŒããªã¹ãã«é¢ãã泚æ
LMDB ãããªã㯠API ã®ãã¹ãŠã®é¢æ°ã¯ãäœæ¥ã®çµæããšã©ãŒ ã³ãŒãã®åœ¢åŒã§è¿ããŸãããåŸç¶ã®ãã¹ãŠã®ãªã¹ãã§ã¯ãç°¡æœã«ããããã«ãã®ãã§ãã¯ã¯çç¥ãããŠããŸããå®éã«ã¯ããªããžããªãšå¯Ÿè©±ããããã«ç¬èªã®ã³ãŒãã䜿çšããŸããã
LMDB ã iOS ãŸã㯠macOS ãããžã§ã¯ãã«æ¥ç¶ããæéã®æ¹æ³ãšããŠãCocoaPod ãæäŸããŸãã
4.1. åºæ¬çãªæœè±¡å
ç°å¢
æ§é MDB_env
ã¯ãLMDB ã®å
éšç¶æ
ã®ãªããžããªã§ãã æ¥é èŸä»ãé¢æ°ã®ãã¡ããªãŒ mdb_env
ããã€ãã®ããããã£ãèšå®ã§ããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ããšã³ãžã³ã®åæåã¯æ¬¡ã®ããã«ãªããŸãã
mdb_env_create(env);â
mdb_env_set_map_size(*env, 1024 * 1024 * 512)â
mdb_env_open(*env, path.UTF8String, MDB_NOTLS, 0664);
Mail.ru ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãXNUMX ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ã®ããã©ã«ãå€ãå€æŽããŸããã
XNUMX ã€ç®ã¯ãã¹ãã¬ãŒãž ãã¡ã€ã«ãããããããä»®æ³ã¢ãã¬ã¹ç©ºéã®ãµã€ãºã§ãã æ®å¿µãªãããåãããã€ã¹ã§ãã£ãŠããç¹å®ã®å€ã¯å®è¡ããšã«å€§ããç°ãªãå¯èœæ§ããããŸãã iOS ã®ãã®æ©èœãèæ
®ããŠãã¹ãã¬ãŒãžã®æ倧éãåçã«éžæããŸãã ç¹å®ã®å€ããéå§ããŠãé¢æ°ãéæããããŸã§é£ç¶çã«ååã«ãªããŸãã mdb_env_open
以å€ã®çµæã¯è¿ãããŸãã ENOMEM
ã çè«çã«ã¯ãéã®æ¹æ³ããããŸãããŸããšã³ãžã³ã«æå°éã®ã¡ã¢ãªãå²ãåœãŠã次ã«ãšã©ãŒãåä¿¡ãããšãã«ã MDB_MAP_FULL
ãå¢ãããŠãã ããã ããããããã¯ã¯ããã«åä»ã§ãã ãã®çç±ã¯ãé¢æ°ã䜿çšããŠã¡ã¢ãªãåãããã³ã°ããæé ã mdb_env_set_map_size
以åã«ãšã³ãžã³ããåãåã£ããã¹ãŠã®ãšã³ãã£ã㣠(ã«ãŒãœã«ããã©ã³ã¶ã¯ã·ã§ã³ãããŒãå€) ãç¡å¹ã«ããŸãã ã³ãŒãå
ã§ãã®ãããªåºæ¥äºã®å€åãèæ
®ãããšãã³ãŒãã倧å¹
ã«è€éã«ãªããŸãã ããã§ããä»®æ³ã¡ã¢ãªãããªãã«ãšã£ãŠéåžžã«å€§åã§ããå Žåãããã¯ã¯ããå
ã®åå²ç¹ã«æ³šç®ããçç±ã«ãªããããããŸããã
10 çªç®ã®ãã©ã¡ãŒã¿ã¯ãããã©ã«ãå€ãé©åã§ã¯ãããŸããã§ããããã¹ã¬ããã®å®å
šæ§ã確ä¿ããã¡ã«ããºã ãå¶åŸ¡ããŸãã æ®å¿µãªãããå°ãªããšã iOS XNUMX ã§ã¯ãã¹ã¬ãã ããŒã«ã« ã¹ãã¬ãŒãžã®ãµããŒãã«åé¡ããããŸãã ãã®ãããäžèšã®äŸã§ã¯ããªããžããªã¯æ¬¡ã®ãã©ã°ã§éãããŸãã MDB_NOTLS
ã ããã«ã次ã®ããšãå¿
èŠã§ãã
ããŒã¿ããŒã¹
ããŒã¿ããŒã¹ã¯ãäžã§èª¬æãã B ããªãŒã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã ãã®ãªãŒãã³ã¯ãã©ã³ã¶ã¯ã·ã§ã³å ã§è¡ããããããæåã¯å°ãå¥åŠã«æãããããããŸããã
MDB_txn *txn;â
MDB_dbi dbi;â
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);â
mdb_dbi_open(txn, NULL, MDB_CREATE, &dbi);â
mdb_txn_abort(txn);
å®éãLMDB ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¹ãã¬ãŒãž ãšã³ãã£ãã£ã§ãããç¹å®ã®ããŒã¿ããŒã¹ã§ã¯ãããŸããã ãã®æŠå¿µã«ãããç°ãªãããŒã¿ããŒã¹ã«ãããšã³ãã£ãã£ã«å¯ŸããŠã¢ãããã¯ãªæäœãå®è¡ã§ããŸãã çè«çã«ã¯ãããã«ãããããŸããŸãªããŒã¿ããŒã¹ã®åœ¢åŒã§ããŒãã«ãã¢ãã«åããå¯ââèœæ§ãéãããŸãããåŸã§è©³ãã説æããããã«ãç§ã¯ãã€ãŠå¥ã®æ¹æ³ããšããŸããã
ããŒãšå€
æ§é MDB_val
ããŒãšå€ã®äž¡æ¹ã®æŠå¿µãã¢ãã«åããŸãã ãªããžããªã¯ãããã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠã¯ç¥ããŸããã 圌女ã«ãšã£ãŠãç°ãªããã®ã¯ãæå®ããããµã€ãºã®ãã€ãã®é
åã«ãããŸããã ããŒã®æ倧ãµã€ãºã¯ 512 ãã€ãã§ãã
typedef struct MDB_val {â
size_t mv_size;â
void *mv_data;â
} MDB_val;ââ
ã¹ãã¢ã¯ã³ã³ãã¬ãŒã¿ã䜿çšããŠããŒãæé ã«äžŠã¹æ¿ããŸãã ç¬èªã®ãã®ã«çœ®ãæããªãå Žåã¯ãèŸæžç·šéé ã«ãã€ãããšã«äžŠã¹æ¿ããããã©ã«ãã®ãã®ã䜿çšãããŸãã
ååŒ
ãã©ã³ã¶ã¯ã·ã§ã³ããã€ã¹ã«ã€ããŠã¯ã以äžã§è©³ãã説æãããŠããŸãã
- ãã¹ãŠã®åºæ¬ããããã£ã®ãµããŒã
ACID ããŒã¯ãŒã: ååæ§ãäžè²«æ§ãåé¢æ§ãä¿¡é Œæ§ã macOS ãš iOS ã§ã®èä¹ æ§ã®ç¹ã§ãMDBX ã§ä¿®æ£ããããã°ãããããšã«æ³šæããã«ã¯ããããŸããã 詳ããã¯ã圌ãã®èšäºãã芧ãã ãããREADME . - ãã«ãã¹ã¬ãããžã®ã¢ãããŒãã¯ããåäžã©ã€ã¿ãŒ/è€æ°ãªãŒããŒãã¹ããŒã ã§èª¬æãããŸãã ã©ã€ã¿ãŒã¯äºãã«ãããã¯ããŸããããªãŒããŒã¯ãããã¯ããŸããã ãªãŒããŒã¯ã©ã€ã¿ãŒããããã¯ããããçžäºã«ãããã¯ãããããŸããã
- ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã®ãµããŒãã
- ãã«ãããŒãžã§ã³ã®ãµããŒãã
LMDB ã®ãã«ãããŒãžã§ã³ç®¡çã¯éåžžã«åªããŠããã®ã§ãå®éã«åäœã瀺ããããšæããŸãã 以äžã®ã³ãŒãã¯ãåãã©ã³ã¶ã¯ã·ã§ã³ãããã®ãªãŒãã³æã«é¢é£ããŠããããŒãžã§ã³ã®ããŒã¿ããŒã¹ãæ£ç¢ºã«æäœãããã®åŸã®ãã¹ãŠã®å€æŽããå®å šã«åé¢ãããŠããããšã瀺ããŠããŸãã ãªããžããªãåæåãããããªããžããªã«ãã¹ã ã¬ã³ãŒããè¿œå ãããããããšã¯éèŠã§ã¯ãªãããããããã®ååŒã¯ã¹ãã€ã©ãŒã®äžã«æ®ãããŸãã
ãã¹ããšã³ããªã®è¿œå
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
mdb_env_create(&env);
mdb_env_open(env, "./testdb", MDB_NOTLS, 0664);
mdb_txn_begin(env, NULL, 0, &txn);
mdb_dbi_open(txn, NULL, 0, &dbi);
mdb_txn_abort(txn);
char k = 'k';
MDB_val key;
key.mv_size = sizeof(k);
key.mv_data = (void *)&k;
int v = 997;
MDB_val value;
value.mv_size = sizeof(v);
value.mv_data = (void *)&v;
mdb_txn_begin(env, NULL, 0, &txn);
mdb_put(txn, dbi, &key, &value, MDB_NOOVERWRITE);
mdb_txn_commit(txn);
MDB_txn *txn1, *txn2, *txn3;
MDB_val val;
// ÐÑкÑÑваеЌ 2 ÑÑаМзакÑОО, ÐºÐ°Ð¶ÐŽÐ°Ñ ÐžÐ· кПÑПÑÑÑ
ÑЌПÑÑОÑ
// Ма веÑÑÐžÑ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
Ñ ÐŸÐŽÐœÐŸÐ¹ запОÑÑÑ.
mdb_txn_begin(env, NULL, 0, &txn1); // read-write
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn2); // read-only
// Ð ÑаЌкаÑ
пеÑвПй ÑÑаМзакÑОО ÑЎалÑеЌ Оз Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
ÑÑÑеÑÑвÑÑÑÑÑ Ð² Мей запОÑÑ.
mdb_del(txn1, dbi, &key, NULL);
// ЀОкÑОÑÑеЌ ÑЎалеМОе.
mdb_txn_commit(txn1);
// ÐÑкÑÑваеЌ ÑÑеÑÑÑ ÑÑаМзакÑОÑ, кПÑПÑÐ°Ñ ÑЌПÑÑÐžÑ ÐœÐ°
// акÑÑалÑÐœÑÑ Ð²ÐµÑÑÐžÑ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
, гЎе запОÑО Ñже МеÑ.
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn3);
// УбежЎаеЌÑÑ, ÑÑП запОÑÑ Ð¿ÐŸ ОÑÐºÐŸÐŒÐŸÐŒÑ ÐºÐ»ÑÑÑ Ñже Ме ÑÑÑеÑÑвÑеÑ.
assert(mdb_get(txn3, dbi, &key, &val) == MDB_NOTFOUND);
// ÐавеÑÑаеЌ ÑÑаМзакÑОÑ.
mdb_txn_abort(txn3);
// УбежЎаеЌÑÑ, ÑÑП в ÑаЌкаÑ
вÑПÑПй ÑÑаМзакÑОО, ПÑкÑÑÑПй Ма ЌПЌеМÑ
// ÑÑÑеÑÑÐ²ÐŸÐ²Ð°ÐœÐžÑ Ð·Ð°Ð¿ÐžÑО в базе ЎаММÑÑ
, ÐµÑ Ð²ÑÑ ÐµÑÑ ÐŒÐŸÐ¶ÐœÐŸ МайÑО пП клÑÑÑ.
assert(mdb_get(txn2, dbi, &key, &val) == MDB_SUCCESS);
// ÐÑПвеÑÑеЌ, ÑÑП пП клÑÑÑ Ð¿ÐŸÐ»ÑÑеМ Ме Ð°Ð±Ñ ÐºÐ°ÐºÐŸÐ¹ ÐŒÑÑПÑ, а валОЎМÑе ЎаММÑе.
assert(*(int *)val.mv_data == 997);
// ÐавеÑÑаеЌ ÑÑаМзакÑОÑ, ÑабПÑаÑÑей Ñ
ПÑÑ Ðž Ñ ÑÑÑаÑевÑей, МП кПМÑОÑÑеМÑМПй базПй ЎаММÑÑ
.
mdb_txn_abort(txn2);
å¿ èŠã«å¿ããŠãSQLite ã§åãããªãã¯ãè©ŠããŠãäœãèµ·ãããã確èªããããšããå§ãããŸãã
ãã«ãããŒãžã§ã³åã¯ãiOS éçºè
ã®ç掻ã«éåžžã«çŽ æŽãããã¡ãªããããããããŸãã ãã®ããããã£ã䜿çšãããšããŠãŒã¶ãŒ ãšã¯ã¹ããªãšã³ã¹ã®èæ
®äºé
ã«åºã¥ããŠãç»é¢ãã©ãŒã ã®ããŒã¿ ãœãŒã¹æŽæ°ã¬ãŒããç°¡åãã€èªç¶ã«èª¿æŽã§ããŸãã ããšãã°ãã·ã¹ãã ã¡ãã£ã¢ ã®ã£ã©ãªãŒããã®ã³ã³ãã³ãã®èªåèªã¿èŸŒã¿ãªã©ãMail.ru ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã®æ©èœãèããŠã¿ãŸãããã æ¥ç¶ãè¯å¥œã§ããã°ãã¯ã©ã€ã¢ã³ã㯠XNUMX ç§ãããæ°æã®åçããµãŒããŒã«è¿œå ã§ããŸãã ããŠã³ããŒããããã³ã«æŽæ°ããå Žå UICollectionView
ãŠãŒã¶ãŒã®ã¯ã©ãŠãå
ã®ã¡ãã£ã¢ ã³ã³ãã³ãã§ã¯ããã®ããã»ã¹äžã« 60 fps ãã¹ã ãŒãºãªã¹ã¯ããŒã«ã®ããšãå¿ããããšãã§ããŸãã é »ç¹ãªç»é¢æŽæ°ãé²ãã«ã¯ãããŒã¹å
ã®ããŒã¿å€æŽé床ãäœããã®æ¹æ³ã§å¶éããå¿
èŠããããŸãã UICollectionViewDataSource
.
ããŒã¿ããŒã¹ããã«ãããŒãžã§ã³ããµããŒãããŠããããçŸåšã®ç¶æ ã§ã®ã¿äœæ¥ã§ããå Žåãæéå®å®ããããŒã¿ ã¹ãããã·ã§ãããäœæããã«ã¯ããããã¡ã¢ãªå ã®ããŒã¿æ§é ãŸãã¯äžæããŒãã«ã«ã³ããŒããå¿ èŠããããŸãã ãããã®ã¢ãããŒãã¯ããããéåžžã«é«äŸ¡ã§ãã ã€ã³ã¡ã¢ãª ã¹ãã¬ãŒãžã®å Žåãæ§ç¯ããããªããžã§ã¯ãã®ä¿åã«ãã£ãŠçºçããã¡ã¢ãª ã³ã¹ããšãåé·ãª ORM å€æã«é¢é£ããæéã³ã¹ãã®äž¡æ¹ãçºçããŸãã äžæããŒãã«ã«é¢ããŠã¯ãããã¯ããã«é«äŸ¡ãªæ¥œãã¿ã§ãããéèŠãªå Žåã«ã®ã¿æå³ããããŸãã
LMDB ã®ãã«ãããŒãžã§ã³åã¯ãå®å®ããããŒã¿ ãœãŒã¹ãç¶æãããšããåé¡ãéåžžã«ãšã¬ã¬ã³ããªæ¹æ³ã§è§£æ±ºããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãéãã ãã§ååã§ãããã©ã³ã¶ã¯ã·ã§ã³ãå®äºãããŸã§ãããŒã¿ ã»ããã¯ä¿®æ£ãããããšãä¿èšŒãããŸãã æŽæ°ã¬ãŒãã®ããžãã¯ã¯å®å šã«ãã¬ãŒã³ããŒã·ã§ã³å±€ã®æã«å§ããããŠããã倧éã®ãªãœãŒã¹ã®ãªãŒããŒãããã¯çºçããŸããã
ã«ãŒãœã«
ã«ãŒãœã«ã¯ãB ããªãŒãèµ°æ»ããããšã«ãããããŒãšå€ã®ãã¢ãèŠåçã«å埩ããããã®ã¡ã«ããºã ãæäŸããŸãã ãããããªããã°ãããŒã¿ããŒã¹å ã®ããŒãã«ãå¹æçã«ã¢ãã«åããããšã¯äžå¯èœã§ãããããã§æ³šç®ããŸãã
4.2. ããŒãã«ã¢ããªã³ã°
ããŒé åºä»ãããããã£ã䜿çšãããšãåºæ¬çãªæœè±¡åã®äžã«ããŒãã«ãªã©ã®ãããã¬ãã«ã®æœè±¡åãæ§ç¯ã§ããŸãã ãã®ããã»ã¹ãããŠãŒã¶ãŒã®ãã¹ãŠã®ãã¡ã€ã«ãšãã©ã«ããŒã«é¢ããæ å ±ããã£ãã·ã¥ãããŠããã¯ã©ãŠã ã¯ã©ã€ã¢ã³ãã®ã¡ã€ã³ ããŒãã«ã®äŸã§èããŠã¿ãŸãããã
ããŒãã«ã¹ããŒã
ãã©ã«ã㌠ããªãŒãå«ãããŒãã«ã®æ§é ãæ確ã«ããå¿
èŠãããäžè¬çãªã·ããªãªã® XNUMX ã€ã¯ãç¹å®ã®ãã£ã¬ã¯ããªå
ã«ãããã¹ãŠã®èŠçŽ ãéžæããããšã§ãããã®çš®ã®å¹ççãªã¯ãšãªã«é©ããããŒã¿ç·šæã¢ãã«ã¯æ¬¡ã®ãšããã§ãã
äžã®å³ã¯ãã¿ã¹ã¯ã«åºã¥ããŠããã€ãã®é åãšããŠã®ããŒã®è¡šçŸãã©ã®ããã«èŠãããã瀺ããŠããŸãã ãŸãã芪ãã£ã¬ã¯ããªèå¥å (èµ€) ãæã€ãã€ããé 眮ããã次ã«ã¿ã€ã (ç·) ãé 眮ããããã§ã«åå (é) ãæ«å°Ÿã«é 眮ãããŸããããã©ã«ãã® LMDB ã³ã³ãã¬ãŒã¿ã«ãã£ãŠèŸæžé ã«äžŠã¹æ¿ããããããã次ã®ããã«äžŠã¹ãããŸããå¿ èŠãªæ¹æ³ã åãèµ€ãæ¥é èŸãæã€ããŒãé 次走æ»ãããšãè¿œå ã®åŸåŠçãå¿ èŠãšããã«ããŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºãããé åºã§ãããã«é¢é£ä»ããããå€ãåŸãããŸã (å³)ã
ããŒãšå€ã®ã·ãªã¢ã«å
ãªããžã§ã¯ããã·ãªã¢ã«åããæ¹æ³ã¯äžçäžã«æ°å€ããããŸãã é床以å€ã®èŠä»¶ã¯ãªãã£ããããC èšèªæ§é ã®ã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠå æãããã¡ã¢ãª ãã³ããšãããå¯èœãªéãé«éãªãã®ãéžæããŸããããããã£ãŠããã£ã¬ã¯ããªèŠçŽ ã®ããŒã¯æ¬¡ã®æ§é ã§ã¢ãã«åã§ããŸãã NodeKey
.
typedef struct NodeKey {â
EntityId parentId;â
uint8_t type;â
uint8_t nameBuffer[256];â
} NodeKey;
ä¿åãã NodeKey
ãªããžã§ã¯ãå
ã®ã¹ãã¬ãŒãžãå¿
èŠã§ã MDB_val
ããŒã¿ãžã®ãã€ã³ã¿ãæ§é äœã®å
é ã®ã¢ãã¬ã¹ã«é
眮ããé¢æ°ã§ãµã€ãºãèšç®ããŸãã sizeof
.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = sizeof(NodeKey),
.mv_data = (void *)key
};
}
ããŒã¿ããŒã¹ã®éžæåºæºã«é¢ããæåã®ç« ã§ã¯ãCRUD æäœã®äžéšãšããŠåçå²ãåœãŠãæå°éã«æããããšãéèŠãªéžæèŠçŽ ã§ãããšè¿°ã¹ãŸããã æ©èœã³ãŒã serialize
ã¯ãLMDB ã®å Žåãæ°ããã¬ã³ãŒããããŒã¿ããŒã¹ã«æ¿å
¥ããããšãã«ãããã®ãšã©ãŒãå®å
šã«åé¿ã§ããæ¹æ³ã瀺ããŠããŸãã ãµãŒããŒããåä¿¡ãããã€ãé
åã¯ããŸãã¹ã¿ãã¯æ§é ã«å€æããããã®åŸãã¹ãã¬ãŒãžã«ç°¡åã«ãã³ããããŸãã LMDB å
ã«ã¯åçå²ãåœãŠããªããããiOS ã®æšæºã§ã¯çŽ æŽãããç¶æ³ãåŸãããŸãããããã¯ãŒã¯ãããã£ã¹ã¯ã«è³ããŸã§ã®ããŒã¿ã®åŠçã«ã¯ã¹ã¿ã㯠ã¡ã¢ãªã®ã¿ã䜿çšããŸãã
ãã€ããªã³ã³ãã¬ãŒã¿ã䜿çšããããŒã®é åºä»ã
ããŒã®é åºé¢ä¿ã¯ãã³ã³ãã¬ãŒã¿ãšåŒã°ããç¹å¥ãªé¢æ°ã«ãã£ãŠäžããããŸãã ãšã³ãžã³ã¯ãå«ãŸãããã€ãã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠäœãç¥ããªããããããã©ã«ãã®ã³ã³ãã¬ãŒã¿ãŒã¯ããã€ãããšã®æ¯èŒã«é Œã£ãŠãããŒãèŸæžç·šéé ã«é 眮ãã以å€ã«éžæè¢ããããŸããã ããã䜿çšããŠæ§é ç©ãé 眮ããããšã¯ã圫å»æ§ã§åãããšã«äŒŒãŠããŸãã ãã ããåçŽãªå Žåã«ã¯ããã®æ¹æ³ãåãå ¥ãããããšæããŸãã 代æ¿æ¡ã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãããããã§ã¯éäžã«æ£åšããããã€ãã®çæã«æ³šç®ããŸãã
æåã«èŠããŠããã¹ãããšã¯ãããªããã£ã ããŒã¿åã®ã¡ã¢ãªè¡šçŸã§ãã ãããã£ãŠããã¹ãŠã® Apple ããã€ã¹ã§ã¯ãæŽæ°å€æ°ã¯æ¬¡ã®åœ¢åŒã§ä¿åãããŸãã
// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)
ãã®åé¡ã解決ããã«ã¯ããã€ã ã³ã³ãã¬ãŒã¿ã«é©ãã圢åŒã§æŽæ°ãããŒã«æ ŒçŽããå¿
èŠããããŸãã 家æã®åœ¹å²ã¯ãå¿
èŠãªå€é©ãå®è¡ããã®ã«åœ¹ç«ã¡ãŸãã hton*
ïŒç¹ã« htons
äŸã®å
šè§æ°åã®å Žå)ã
ãåç¥ã®ãšãããããã°ã©ãã³ã°ã§æååãè¡šçŸããããã®åœ¢åŒã¯ã
XNUMXçªç®ã«çæãã¹ãããšã¯ã packed
.
å€éšã³ã³ãã¬ãŒã¿ã«ããããŒã®é åºä»ã
éèŠãªæ¯èŒããžãã¯ã¯ããã€ã㪠ã³ã³ãã¬ãŒã¿ã«ãšã£ãŠã¯è€éãããããšãå€æããå ŽåããããŸãã å€ãã®çç±ã®ãã¡ã® XNUMX ã€ã¯ãæ§é å ã«æè¡åéãååšããããšã§ãã ãã£ã¬ã¯ããªèŠçŽ ãšããŠãã§ã«ããç¥ãããŠããããŒã®äŸã§ããã®çºçã説æããŸãã
typedef struct NodeKey {â
EntityId parentId;â
uint8_t type;â
uint8_t nameBuffer[256];â
} NodeKey;
éåžžã«ã·ã³ãã«ã§ããã«ãããããããã»ãšãã©ã®å Žåãã¡ã¢ãªã倧éã«æ¶è²»ããŸãã ã¿ã€ãã« ãããã¡ãŒã¯ 256 ãã€ãã§ãããå¹³åããŠãã¡ã€ã«åããã©ã«ããŒåã 20 ïœ 30 æåãè¶ ããããšã¯ã»ãšãã©ãããŸããã
ã¬ã³ãŒãã®ãµã€ãºãæé©åããããã®æšæºçãªææ³ã® XNUMX ã€ã¯ãå®éã®ãµã€ãºã«åãããŠã¬ã³ãŒãããã«ãããããããšã§ãã ãã®æ¬è³ªã¯ããã¹ãŠã®å¯å€é·ãã£ãŒã«ãã®å
容ãæ§é äœã®æåŸã«ãããããã¡ãŒã«æ ŒçŽããããã®é·ããå¥ã®å€æ°ã«æ ŒçŽããããšããããšã§ãã NodeKey
以äžã®ããã«å€åœ¢ãããŸãã
typedef struct NodeKey {â
EntityId parentId;â
uint8_t type;â
uint8_t nameLength;â
uint8_t nameBuffer[256];â
} NodeKey;
ãªããã·ãªã¢ã«åæã¯ããŒã¿ãµã€ãºãšããŠæå®ãããŸããã sizeof
æ§é å
šäœã§ããããã¹ãŠã®ãã£ãŒã«ãã®ãµã€ãºã¯åºå®é·ã«ãããã¡ã®å®éã«äœ¿çšãããéšåã®ãµã€ãºãå ãããã®ã«ãªããŸãã
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = offsetof(NodeKey, nameBuffer) + key->nameLength,
.mv_data = (void *)key
};
}
ãªãã¡ã¯ã¿ãªã³ã°ã®çµæãããŒãå ããã¹ããŒã¹ã倧å¹
ã«ç¯çŽãããŸããã ãã ããæè¡çãªåéã®ããã nameLength
ãããã©ã«ãã®ãã€ã㪠ã³ã³ãã¬ãŒã¿ã¯ããŒæ¯èŒã«ã¯é©ããªããªããŸããã ãããç¬èªã®ãã®ã«çœ®ãæããªãå Žåã䞊ã¹æ¿ãã§ã¯ååèªäœãããååã®é·ããåªå
ãããããšã«ãªããŸãã
LMDB ã䜿çšãããšãåããŒã¿ããŒã¹ã«ç¬èªã®ããŒæ¯èŒæ©èœãæãããããšãã§ããŸãã ããã¯é¢æ°ã䜿çšããŠè¡ãããŸã mdb_set_compare
å³å¯ã«ã¯éå°åã§ãã æãããªçç±ã«ãããããŒã¿ããŒã¹ã¯ãã®åç¶æéãéããŠå€æŽããããšãã§ããŸããã ã³ã³ãã¬ãŒã¿ã¯å
¥åæã« 1 ã€ã®ããŒããã€ããªåœ¢åŒã§åãåããåºåæã«æ¯èŒçµæ (-1 ããå°ããã0 ãã倧ããããŸã㯠XNUMX) ãè¿ããŸãã ã®ç䌌ã³ãŒã NodeKey
ãã®ããã§ãã
int compare(MDB_val * const a, MDB_val * const b) {â
NodeKey * const aKey = (NodeKey * const)a->mv_data;â
NodeKey * const bKey = (NodeKey * const)b->mv_data;â
return // ...
}â
ããŒã¿ããŒã¹å ã®ãã¹ãŠã®ããŒãåãåã§ããéãããã®ãã€ãè¡šçŸãããŒã®ã¢ããªã±ãŒã·ã§ã³æ§é ã®åã«ç¡æ¡ä»¶ã«ãã£ã¹ãããããšã¯åæ³ã§ãã ããã«ã¯ãã¥ã¢ã³ã¹ã XNUMX ã€ãããŸãããããã«ã€ããŠã¯ãèªæžèšé²ãã®ãµãã»ã¯ã·ã§ã³ã§å°ãäžã§èª¬æããŸãã
å€ã®ã·ãªã¢ã«å
ä¿åãããã¬ã³ãŒãã®ããŒã䜿çšããŠãLMDB ã¯éåžžã«éäžçã«åäœããŸãã ãããã¯ãã¢ããªã±ãŒã·ã§ã³æäœã®ãã¬ãŒã ã¯ãŒã¯å ã§çžäºã«æ¯èŒããããœãªã¥ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ã¯ã³ã³ãã¬ãŒã¿ãŒã®é床ã«äŸåããŸãã çæ³çã«ã¯ãããŒãæ¯èŒããã«ã¯ããã©ã«ãã®ãã€ã㪠ã³ã³ãã¬ãŒã¿ã§ååã§ããã¯ãã§ãããã©ãããŠãç¬èªã®ãã€ã㪠ã³ã³ãã¬ãŒã¿ã䜿çšããå¿ èŠãããå Žåã¯ããã®äžã§ããŒãéã·ãªã¢ã«åããæé ãã§ããã ãé«éã«ããå¿ èŠããããŸãã
ããŒã¿ããŒã¹ã¯ãã¬ã³ãŒãã®å€éšå (å€) ã«ã¯ç¹ã«é¢å¿ããããŸããã ãã€ãè¡šçŸãããªããžã§ã¯ããžã®å€æã¯ãã¢ããªã±ãŒã·ã§ã³ ã³ãŒãã§ãã§ã«å¿
èŠãšãããŠããå Žå (ããšãã°ãç»é¢äžã«è¡šç€ºããå Žå) ã«ã®ã¿è¡ãããŸãã ããã¯æ¯èŒçãŸãã«çºçããããããã®æé ã®é床ã«é¢ããèŠä»¶ã¯ããã»ã©éèŠã§ã¯ãªããå®è£
ã§ã¯å©äŸ¿æ§ãããèªç±ã«éèŠã§ããŸããããšãã°ããŸã ããŠã³ããŒããããŠããªããã¡ã€ã«ã«é¢ããã¡ã¿ããŒã¿ãã·ãªã¢ã«åããã«ã¯ã次ã䜿çšããŸãã NSKeyedArchiver
.
NSData *data = serialize(object);â
MDB_val value = {â
.mv_size = data.length,â
.mv_data = (void *)data.bytesâ
};
ãã ããããã©ãŒãã³ã¹ãéèŠãªå ŽåããããŸãã ããšãã°ããŠãŒã¶ãŒ ã¯ã©ãŠãã®ãã¡ã€ã«æ§é ã«é¢ããã¡ã¿æ å ±ãä¿åããå Žåãåããªããžã§ã¯ã ã¡ã¢ãª ãã³ãã䜿çšããŸãã ã·ãªã¢ã«åãããè¡šçŸãçæããã¿ã¹ã¯ã®ãã€ã©ã€ãã¯ããã£ã¬ã¯ããªã®èŠçŽ ãã¯ã©ã¹éå±€ã«ãã£ãŠã¢ãã«åããããšããäºå®ã§ãã
C èšèªã§ã®å®è£ ã§ã¯ãç¶æ¿è ã®ç¹å®ã®ãã£ãŒã«ããå¥ã®æ§é äœã«åãåºãããåºæ¬ãã£ãŒã«ããšã®æ¥ç¶ãå ±çšäœåã®ãã£ãŒã«ããéããŠæå®ãããŸãã å ±çšäœã®å®éã®å 容ã¯ãtype æè¡å±æ§ã«ãã£ãŠæå®ãããŸãã
typedef struct NodeValue {â
EntityId localId;â
EntityType type;â
union {â
FileInfo file;â
DirectoryInfo directory;â
} info;â
uint8_t nameLength;â
uint8_t nameBuffer[256];â
} NodeValue;â
ã¬ã³ãŒãã®è¿œå ãšæŽæ°
ã·ãªã¢ã«åãããããŒãšå€ãã¹ãã¢ã«è¿œå ã§ããŸãã ãã®ããã«ãé¢æ°ã䜿çšãããŸã mdb_put
.
// key О value ОЌеÑÑ ÑОп MDB_valâ
mdb_put(..., &key, &value, MDB_NOOVERWRITE);
æ§æ段éã§ããªããžããªãåãããŒãæã€è€æ°ã®ã¬ã³ãŒããä¿åããããšãèš±å¯ãŸãã¯çŠæ¢ã§ããŸããããŒã®éè€ãçŠæ¢ãããŠããå Žåãã¬ã³ãŒããæ¿å
¥ãããšãã«ãæ¢åã®ã¬ã³ãŒãã®æŽæ°ãèš±å¯ãããã©ããã決å®ã§ããŸãã ã»ã€ããã³ãŒãå
ã®ãšã©ãŒã®çµæãšããŠã®ã¿çºçããå¯èœæ§ãããå Žåã¯ããã©ã°ãæå®ããããšã§ã»ã€ããé²ãããšãã§ããŸãã NOOVERWRITE
ã
èªæžèšé²
LMDBã®ã¬ã³ãŒããèªã¿åãé¢æ°ã¯æ¬¡ã®ãšããã§ãã mdb_get
ã ããŒãšå€ã®ãã¢ã以åã«ãã³ããããæ§é ã«ãã£ãŠè¡šãããŠããå Žåããã®æé ã¯æ¬¡ã®ããã«ãªããŸãã
NodeValue * const readNode(..., NodeKey * const key) {â
MDB_val rawKey = serialize(key);â
MDB_val rawValue;â
mdb_get(..., &rawKey, &rawValue);â
return (NodeValue * const)rawValue.mv_data;â
}
æ瀺ããããªã¹ãã¯ãæ§é ã®ãã³ãã«ããã·ãªã¢ã«åã«ãã£ãŠãããŒã¿ã®æžã蟌ã¿æã ãã§ãªãèªã¿åãæã«åçå²ãåœãŠãã©ã®ããã«åãé€ãããšãã§ãããã瀺ããŠããŸãã é¢æ°ãã掟ç mdb_get
ãã€ã³ã¿ã¯ãããŒã¿ããŒã¹ããªããžã§ã¯ãã®ãã€ãè¡šçŸãæ ŒçŽããä»®æ³ã¡ã¢ãª ã¢ãã¬ã¹ãæ£ç¢ºã«åç
§ããŸãã å®éãéåžžã«é«éãªããŒã¿èªã¿åããæäŸããäžçš®ã® ORM ãã»ãŒç¡æã§å
¥æã§ããŸãã ãã®ã¢ãããŒãã®çŸãããšãšãã«ãããã«é¢é£ããããã€ãã®æ©èœãèŠããŠããå¿
èŠããããŸãã
- èªã¿åãå°çšãã©ã³ã¶ã¯ã·ã§ã³ã®å Žåãå€æ§é äœãžã®ãã€ã³ã¿ãŒã¯ããã©ã³ã¶ã¯ã·ã§ã³ãçµäºãããŸã§ã®ã¿æå¹ã§ããããšãä¿èšŒãããŸãã åè¿°ããããã«ããªããžã§ã¯ããååšãã B ããªãŒã®ããŒãžã¯ãã³ããŒãªã³ã©ã€ãã®ååã«ãããå°ãªããšã XNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåç §ããŠããéãå€æŽãããŸããã åæã«ããããã«é¢é£ä»ããããæåŸã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºãããšããã«ãããŒãžãæ°ããããŒã¿çšã«åå©çšã§ããŸãã ãªããžã§ã¯ããäœæãããã©ã³ã¶ã¯ã·ã§ã³ãåç¶ãããå¿ èŠãããå Žåã§ãããªããžã§ã¯ããã³ããŒããå¿ èŠããããŸãã
- èªã¿æžããã©ã³ã¶ã¯ã·ã§ã³ã®å Žåãçµæã®æ§é å€ãžã®ãã€ã³ã¿ã¯ãæåã®å€æŽããã·ãŒãžã£ (ããŒã¿ã®æžã蟌ã¿ãŸãã¯åé€) ãå®è¡ããããŸã§ã®ã¿æå¹ã§ãã
- æ§é ã«ããŠãã
NodeValue
æ¬æ Œçã§ã¯ãããŸããããããªãã³ã°ãããŠãã (ãµãã»ã¯ã·ã§ã³ãå€éšã³ã³ãã¬ãŒã¿ã«ããããŒã®é åºä»ãããåç §)ããã€ã³ã¿ãä»ããŠãã®ãã£ãŒã«ãã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã éèŠãªããšã¯ããããéåç §ããªãããšã§ãã - ãããªãå Žåã§ããåä¿¡ãããã€ã³ã¿ãä»ããŠæ§é ãå€æŽããããšã¯ã§ããŸããã ãã¹ãŠã®å€æŽã¯ã¡ãœãããéããŠã®ã¿è¡ãå¿
èŠããããŸã
mdb_put
ã ãã ãããã®æ§é ãé 眮ãããŠããã¡ã¢ãªé åã¯èªã¿åãå°çšã¢ãŒãã§ããããããŠããããããããå®è¡ããããšèããŠãæ©èœããŸããã - ããšãã°ãé¢æ°ã䜿çšããŠæ倧ã¹ãã¬ãŒãž ãµã€ãºãå¢ããããã«ããã¡ã€ã«ãããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«åãããããŸãã
mdb_env_set_map_size
äžè¬ã«ãã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ãšé¢é£ãšã³ãã£ãã£ãç¹ã«èªã¿åããªããžã§ã¯ããžã®ãã€ã³ã¿ãå®å šã«ç¡å¹ã«ããŸãã
æåŸã«ããã XNUMX ã€ã®ç¹åŸŽã¯éåžžã«é°éºãªã®ã§ããã®æ¬è³ªã®é瀺ã¯ãã XNUMX ã€ã®ç¹ã ãã«åœãŠã¯ãŸããŸããã B ããªãŒã«é¢ããç« ã§ã¯ãã¡ã¢ãªå
ã®ããŒãžã®æ§æãå³ã§ç€ºããŸããã ãã®ããšãããã·ãªã¢ã«åãããããŒã¿ãå«ããããã¡ã®å
é ã¢ãã¬ã¹ã¯å®å
šã«ä»»æã§ããããšãããããŸãã ãã®ãããæ§é äœã§ååŸãããããããžã®ãã€ã³ã¿ã¯ã MDB_val
æ§é äœãžã®ãã€ã³ã¿ãžã®ãã£ã¹ãã¯ãéåžžãæŽåãããŠããŸããã åæã«ãäžéšã®ããã (iOS ã®å Žå㯠armv7) ã®ã¢ãŒããã¯ãã£ã§ã¯ãããŒã¿ã®ã¢ãã¬ã¹ããã·ã³ã¯ãŒãã®ãµã€ãºãã€ãŸãã·ã¹ãã ã®ãããæ°ã®åæ°ã§ããããšãå¿
èŠã§ãã (armv7 ã®å Žåããã㯠32 ãããã§ã)ã ã€ãŸãã次ã®ãããªæäœã§ã *(int *foo)0x800002
圌ãã«ãšã£ãŠã¯é亡ãšåçã§ãããè©æ±ºã«ããåŠåã«ã€ãªãã EXC_ARM_DA_ALIGN
ã ãã®ãããªæ²ããéåœãåé¿ããã«ã¯XNUMXã€ã®æ¹æ³ããããŸãã
XNUMX ã€ç®ã¯ãäºåã«ããŒã¿ãæ¢ç¥ã®äœçœ®åããæ§é ã«ã³ããŒããããšã§ãã ããšãã°ãã«ã¹ã¿ã ã³ã³ãã¬ãŒã¿ã§ã¯ãããã¯æ¬¡ã®ããã«åæ ãããŸãã
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey aKey, bKey;
memcpy(&aKey, a->mv_data, a->mv_size);
memcpy(&bKey, b->mv_data, b->mv_size);
return // ...
}
å¥ã®æ¹æ³ã¯ãããŒãšå€ãæã€æ§é äœãå±æ§ã䜿çšããŠæŽåãããªãå¯èœæ§ãããããšãã³ã³ãã€ã©ã«äºåã«éç¥ããããšã§ãã aligned(1)
ã ARM ã§ãåãå¹æãåŸãããŸã
typedef struct __attribute__((packed)) NodeKey {
uint8_t parentId;
uint8_t type;
uint8_t nameLength;
uint8_t nameBuffer[256];
} NodeKey;
ç¯å²ã¯ãšãª
ã¬ã³ãŒãã®ã°ã«ãŒããå埩åŠçããããã«ãLMDB ã¯ã«ãŒãœã«æœè±¡åãæäŸããŸãã ãã§ã«ããç¥ãããŠãããŠãŒã¶ãŒ ã¯ã©ãŠã ã¡ã¿ããŒã¿ãå«ãããŒãã«ã®äŸã䜿çšããŠããã®æäœæ¹æ³ãèŠãŠã¿ãŸãããã
ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã®ãªã¹ãã衚瀺ããäžç°ãšããŠããã®åãã¡ã€ã«ãšãã©ã«ããé¢é£ä»ããããŠãããã¹ãŠã®ããŒãæ€çŽ¢ããå¿
èŠããããŸãã åã®ãµãã»ã¯ã·ã§ã³ã§ã¯ãããŒã䞊ã¹æ¿ããŸããã NodeKey
ãããã£ãŠãæåã«èŠªãã£ã¬ã¯ã㪠ID ã«ãã£ãŠé åºä»ããããŸãã ãããã£ãŠãæè¡çã«ã¯ããã©ã«ããŒã®ã³ã³ãã³ããååŸããã¿ã¹ã¯ã¯ãç¹å®ã®ãã¬ãã£ãã¯ã¹ãæã€ããŒã®ã°ã«ãŒãã®äžéšå¢çã«ã«ãŒãœã«ã眮ãããã®åŸäžéšå¢çãŸã§å埩ããããšã«ãªããŸãã
é 次æ€çŽ¢ã§ãé¡ã®äžãã®äžéãèŠã€ããããšãã§ããŸãã ãããè¡ãã«ã¯ãããŒã¿ããŒã¹å ã®ããŒã®ãªã¹ãå šäœã®å é ã«ã«ãŒãœã«ã眮ãããã®äžã«èŠªãã£ã¬ã¯ããªèå¥åãæã€ããŒã衚瀺ããããŸã§ã«ãŒãœã«ãå¢ãããŸãã ãã®ã¢ãããŒãã«ã¯æãããªæ¬ ç¹ã 2 ã€ãããŸãã
- æ€çŽ¢ã®ç·åœ¢è€éãã¯ããåç¥ã®ãšãããããªãŒäžè¬ãç¹ã« B ããªãŒã§ã¯å¯Ÿæ°æéã§å®è¡ã§ããŸãã
- ç¡é§ã«ãç®çã®ããŒãžã«å è¡ãããã¹ãŠã®ããŒãžããã¡ã€ã«ããã¡ã€ã³ ã¡ã¢ãªã«åŒãäžãããããããéåžžã«ã³ã¹ããããããŸãã
幞ããªããšã«ãLMDB API ã¯ã«ãŒãœã«ãæåã«é
眮ããããã®å¹ççãªæ¹æ³ãæäŸããŸãããããè¡ãã«ã¯ãééã®äžéã«ããããŒä»¥äžã®å€ãæã€ããšãããã£ãŠããããŒãäœæããå¿
èŠããããŸãã ããšãã°ãäžå³ã®ãªã¹ãã«é¢é£ããŠããã£ãŒã«ãã«æ¬¡ã®ãããªããŒãäœæã§ããŸãã parentId
㯠2 ã«ãªããæ®ãã¯ãã¹ãŠãŒãã§åããããŸãã ãã®ãããªéšåçã«å
¥åãããããŒã¯é¢æ°ã®å
¥åã«äŸçµŠãããŸãã mdb_cursor_get
æ瀺æäœ MDB_SET_RANGE
ã
NodeKey upperBoundSearchKey = {â
.parentId = 2,â
.type = 0,â
.nameLength = 0â
};â
MDB_val value, key = serialize(upperBoundSearchKey);â
MDB_cursor *cursor;â
mdb_cursor_open(..., &cursor);â
mdb_cursor_get(cursor, &key, &value, MDB_SET_RANGE);
ããŒã®ã°ã«ãŒãã®äžéãèŠã€ãã£ãå Žåã¯ãããŒãäžèŽããããããŒãå¥ã®ããŒã«äžèŽãããŸã§ããããç¹°ãè¿ããŸãã parentId
ããã§ãªããšããŒããŸã£ãããªããªããŸããã
do {â
rc = mdb_cursor_get(cursor, &key, &value, MDB_NEXT);â
// processing...â
} while (MDB_NOTFOUND != rc && // check end of tableâ
IsTargetKey(key)); // check end of keys groupââ
çŽ æŽãããã®ã¯ãmdb_cursor_get ã䜿çšããå埩ã®äžéšãšããŠãããŒã ãã§ãªãå€ãååŸã§ããããšã§ãã éžææ¡ä»¶ãæºããããã«ãç¹ã«ã¬ã³ãŒãã®å€éšåã®ãã£ãŒã«ãããã§ãã¯ããå¿ èŠãããå Žåãè¿œå ã®ãžã§ã¹ãã£ãªãã§ãã£ãŒã«ãèªäœã«ã¢ã¯ã»ã¹ã§ããŸãã
4.3. ããŒãã«éã®é¢ä¿ã®ã¢ãã«å
ãããŸã§ã«ãç§ãã¡ã¯åäžããŒãã« ããŒã¿ããŒã¹ã®èšèšãšæäœã®ããããåŽé¢ãèæ ®ããããšãã§ããŸããã ããŒãã«ã¯ãåãã¿ã€ãã®ããŒãšå€ã®ãã¢ã§æ§æãããããœãŒããããã¬ã³ãŒãã®ã»ããã§ãããšèšããŸãã ããŒãé·æ¹åœ¢ãšããŠè¡šç€ºããããã«é¢é£ä»ããããå€ãããã¯ã¹ãšããŠè¡šç€ºãããšãããŒã¿ããŒã¹ã®èŠèŠçãªå³ãåŸãããŸãã
â,war
ããããçŸå®ã®ç掻ã§ã¯ãããã»ã©å°éã®åºè¡ã§æžãã§ããŸãããšã¯ã»ãšãã©ãããŸããã å€ãã®å ŽåãããŒã¿ããŒã¹ã§ã¯ããŸããè€æ°ã®ããŒãã«ãå¿ èŠã§ããã次ã«ãäž»ããŒãšã¯ç°ãªãé åºã§ãããã®ããŒãã«å ã§éžæãå®è¡ããå¿ èŠããããŸãã ãã®æåŸã®ã»ã¯ã·ã§ã³ã§ã¯ããã®äœæãšçžäºæ¥ç¶ã®åé¡ã«ã€ããŠèª¬æããŸãã
ã€ã³ããã¯ã¹ããŒãã«
ã¯ã©ãŠã ã¢ããªã«ã¯ãã®ã£ã©ãªãŒãã»ã¯ã·ã§ã³ããããŸãã ã¯ã©ãŠãå šäœã®ã¡ãã£ã¢ ã³ã³ãã³ããæ¥ä»é ã«è¡šç€ºãããŸãã ãã®ãããªéžæãæé©ã«å®è£ ããã«ã¯ãã¡ã€ã³ ããŒãã«ã®é£ã«ãæ°ããã¿ã€ãã®ããŒã䜿çšããŠå¥ã®ããŒãã«ãäœæããå¿ èŠããããŸãã ãããã«ã¯ããã¡ã€ã«ã®äœææ¥ãå«ããã£ãŒã«ããå«ãŸããŠããããããäž»ãªäžŠã¹æ¿ãåºæºãšããŠæ©èœããŸãã æ°ããããŒã¯åºã«ãªãããŒãã«ã®ããŒãšåãããŒã¿ãåç §ãããããã€ã³ããã¯ã¹ ããŒãšåŒã°ããŸãã äžã®å³ã§ã¯ãªã¬ã³ãžè²ã§ãã€ã©ã€ããããŠããŸãã
åãããŒã¿ããŒã¹å ã§ç°ãªãããŒãã«ã®ããŒãäºãã«åé¢ããããã«ãè¿œå ã®æè¡ãã£ãŒã«ã tableId ããã¹ãŠã®ããŒãã«ã«è¿œå ãããŸããã ãœãŒãã®åªå é äœãæåªå ã«ããããšã§ãç¬èªã®ã«ãŒã«ã«åŸã£ãŠãããŒãæåã«ããŒãã«ããšã«ã°ã«ãŒãåãããã§ã«ããŒãã«å ã«ã°ã«ãŒãåããŸãã
ã€ã³ããã¯ã¹ ããŒã¯ãäž»ããŒãšåãããŒã¿ãåç §ããŸãã äž»ããŒã®å€éšåã®ã³ããŒãé¢é£ä»ããŠãã®ããããã£ãçŽæ¥å®è£ ããããšã¯ãããã€ãã®èŠ³ç¹ããäžåºŠã«æé©ãšã¯èšããŸããã
- å æã¹ããŒã¹ã®èŠ³ç¹ããèŠããšãã¡ã¿ããŒã¿ã¯éåžžã«è±å¯ã«ãªãå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®èŠ³ç¹ããèŠããšãããŒãã®ã¡ã¿ããŒã¿ãæŽæ°ãããšãã« XNUMX ã€ã®ããŒãäžæžãããå¿ èŠãããããã§ãã
- ã³ãŒããµããŒãã®èŠ³ç¹ããèŠããšãçµå±ã®ãšãããããããã®ããŒã®ããŒã¿ã®æŽæ°ãå¿ãããšãã¹ãã¬ãŒãžå ã§ããŒã¿ã®äžæŽåãšãã埮åŠãªãã°ãçºçããããšã«ãªããŸãã
次ã«ããããã®æ¬ ç¹ã解æ¶ããæ¹æ³ãèããŸãã
ããŒãã«éã®é¢ä¿ã®æ§æ
ãã®ãã¿ãŒã³ã¯ãã€ã³ããã¯ã¹ ããŒãã«ãã¡ã€ã³ã®ããŒãã«ã«ãªã³ã¯ããã®ã«é©ããŠããŸãã ãå€ãšããŠã®ããŒãã ãã®ååã瀺ãããã«ãã€ã³ããã¯ã¹ ã¬ã³ãŒãã®å€éšåã¯äž»ããŒå€ã®ã³ããŒã§ãã ãã®ã¢ãããŒãã«ããããã©ã€ã㪠ã¬ã³ãŒãã®å€éšåã®ã³ããŒã®ä¿åã«é¢é£ããäžèšã®æ¬ ç¹ããã¹ãŠè§£æ¶ãããŸãã å¯äžã®æéã¯ãã€ã³ããã¯ã¹ ããŒã«ãã£ãŠå€ãååŸããã«ã¯ãããŒã¿ããŒã¹ã«å¯Ÿã㊠2 ã€ã§ã¯ãªã XNUMX ã€ã®ã¯ãšãªãå®è¡ããå¿ èŠãããããšã§ãã æŠç¥çã«ã¯ãçµæãšããŠåŸãããããŒã¿ããŒã¹ ã¹ããŒãã¯æ¬¡ã®ãšããã§ãã
ããŒãã«éã®é¢ä¿ãæŽçããå¥ã®ãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã ãåé·ããŒãã ãã®æ¬è³ªã¯ãããŒã«è¿œå ã®å±æ§ãè¿œå ããããšã§ãããããã¯äžŠã¹æ¿ãã®ããã§ã¯ãªããé¢é£ä»ããããããŒãåäœæããããã«å¿ èŠã§ãããã ããMail.ru ã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ã§ã®å®éã®äœ¿çšäŸããããŸããç¹å®ã® iOS ãã¬ãŒã ã¯ãŒã¯ã®ã³ã³ããã¹ãã§ãæ¶ç©ºã®ããããããããããããäŸã瀺ããŸãã
ã¯ã©ãŠã ã¢ãã€ã« ã¯ã©ã€ã¢ã³ãã«ã¯ããŠãŒã¶ãŒãä»ã®äººãšå ±æãããã¹ãŠã®ãã¡ã€ã«ãšãã©ã«ããŒã衚瀺ããããŒãžããããŸãã ãã®ãããªãã¡ã€ã«ã¯æ¯èŒçå°æ°ã§ããããããã«é¢é£ãã宣äŒã«é¢ããå ·äœçãªæ å ± (誰ã«ã¢ã¯ã»ã¹ãèš±å¯ãããŠããããã©ã®ãããªæš©å©ãä»äžãããŠããããªã©) ãå€æ°ããããããã¡ã€ã«ã«ãã¡ã€ã«ã®å€ã®éšåãè² æ ãããã®ã¯åççã§ã¯ãããŸãããã¡ã€ã³ããŒãã«ã®ã¬ã³ãŒãã ãã ãããã®ãããªãã¡ã€ã«ããªãã©ã€ã³ã§è¡šç€ºãããå Žåã¯ããã¯ãã©ããã«ä¿åããå¿ èŠããããŸãã èªç¶ãªè§£æ±ºçã¯ãããçšã«å¥ã®ããŒãã«ãäœæããããšã§ãã 以äžã®å³ã§ã¯ãããŒã®å é ã«ãPããä»ããŠããããpropnameããã¬ãŒã¹ãã«ããŒã¯ããå ·äœçãªå€ãpublic infoãã«çœ®ãæããããšãã§ããŸãã
æ°ããããŒãã«ãäœæããããã«äœæããããã¹ãŠã®äžæã®ã¡ã¿ããŒã¿ã¯ãã¬ã³ãŒãã®å€éšåã«ç§»åãããŸãã åæã«ãã¡ã€ã³ããŒãã«ã«æ¢ã«ä¿åãããŠãããã¡ã€ã«ããã©ã«ããŒã«é¢ããããŒã¿ãè€è£œããããããŸããã 代ããã«ãåé·ããŒã¿ããããŒã IDãããã³ãã¿ã€ã ã¹ã¿ã³ãããã£ãŒã«ãã®åœ¢åŒã§ãPãããŒã«è¿œå ãããŸãã ãããã®ãããã§ãã€ã³ããã¯ã¹ ããŒãæ§ç¯ããããã«ãã£ãŠäž»ããŒãååŸããæçµçã«ããŒãã®ã¡ã¿ããŒã¿ãååŸã§ããŸãã
çµè«
LMDBã®å°å ¥çµæã¯ååãã«è©äŸ¡ããŠããŸãã ãã®åŸãã¢ããªã±ãŒã·ã§ã³ã®ããªãŒãºæ°ã 30% æžå°ããŸããã
è¡ãããäœæ¥ã®çµæãiOS ããŒã 以å€ãããåé¿ãåŸãããŸããã çŸåšãAndroid ã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªããã¡ã€ã«ãã»ã¯ã·ã§ã³ã® XNUMX ã€ã LMDB ã®äœ¿çšã«åãæ¿ããããŠãããä»ã®éšåãæºåäžã§ãã ããŒãšå€ã®ã¹ãã¬ãŒãžãå®è£
ãããŠãã C èšèªã¯ãæåã« C++ èšèªã§ã¯ãã¹ãã©ãããã©ãŒã ã®ã¢ããªã±ãŒã·ã§ã³ ãã€ã³ãã£ã³ã°ãäœæããã®ã«åœ¹ç«ã¡ãŸããã çµæã® C++ ã©ã€ãã©ãªãš Objective-C ããã³ Kotlin ã®ãã©ãããã©ãŒã ã³ãŒããã·ãŒã ã¬ã¹ã«æ¥ç¶ããã«ã¯ãã³ãŒã ãžã§ãã¬ãŒã¿ãŒã䜿çšãããŸããã
åºæïŒ habr.com