DBMã®è¨è¨ã¨å®è£
ã«ã¤ãã¦20åãããã«åãã¦æ¸ãã¦ã¿ããã¾ãã¯å
¨ä½ã®è¨ç»ã¨ææ°è¾¼ã¿ããã
諸åãç§ã¯DBMã好ãã 諸åãç§ã¯DBMã好ãã 諸åãç§ã¯DBMã大好ãã ããã·ã¥è¡¨ã好ãã éçªå°æ³ã好ãã é£éæ³ã好ãã 赤é»æ¨ã好ãã B+æ¨ã好ãã ã¹ãã¬ã¼æ¨ã好ãã ãã©ã¤æ¨ã好ãã ã¹ããããªã¹ãã好ãã ãã«ã¼ã ãã£ã«ã¿ã好ãã çµ±è¨ã§ãä¼è¨ã§ è¾æ¸æ¤ç´¢ã§ãææ¸æ¤ç´¢ã§ è¨èªå¦çã§ãç»åå¦ç㧠ã¢ã«ã¦ã³ã管çã§ãæ©æ¢°å¦ç¿ã§ ã·ãã¥ã¬ã¼ã·ã§ã³ã§ãã²ã¼ã 㧠ãã¼ã«ã«ã§ãã¯ã©ã¦ã㧠ãã®å°ä¸ã§ä½¿ãããããã¨ãããããã¼ã¿ãã¼ã¹ã大好ãã æ°å¤ã並ã¹ãã ãã®ãã¼ãã«ããä¸ç¬ã§ææã®ã¬ã³ã¼ããæ¢ããã®ã好ãã ãã¼ãã®åå²æä½ãç¹°ãè¿ãã¦ããã¨æ ¹ã«ãã©ãçãã¦æ¨ã®é«ããä¸ãã£ãæãªã©å¿ãè¸ã åä¸ããã»ã¹ã®æãã©ã¤ãã©ãªã ãã§ãã¼ã¿ç®¡çãå®çµããã®ã好ãã ã¡ã¢ãªã¨ã¹ã¬ããã«ç©ãè¨ããã¦å ¨ã¦ã®å ¥åãã¼ã¿ããããå¦çããæãªã©è¸ããããããªæ°æã¡ã ã£ã ã·ãªã¢ã©ã¤ãºããé«æ¬¡ãã¼ã¿ãåãªãæååã¨ãã¦æ ¼ç´ãããã®ã好ãã 人éå¯èªæ§ãæ±ããJSONã«Base64ã¨ã³ã³ã¼ããããã¤ããªãå ¥ãã¦ããæ§ãªã©æåããè¦ãã ã¯ã©ã¹ã®ç°ãªããªãã¸ã§ã¯ãéãç¡çããåä¸ãã¡ã¤ã«ã«æ¼ãè¾¼ãã¦ããæ§ãªã©ã¯ãããã¾ããªã å¾ ã¡ä¸¦ã¶ã¹ã¬ããéãç§ã®æå ¥ããã¸ã§ããã¥ã¼ã¨ã¨ãã«ãã¼ãã¢ãã¬ã¼ã¸ãä¸ããã¹ã±ã¸ã¥ã¼ã©ã«ããããã¨åããããã®ãæé«ã åããªããªã¼ãããã¯éãç²æ«ãªã¬ãã³ã¬ã§çµåãããã®ãç¡è¦ãã¦ãã¼ã¸ãã¨è¨æ¶é åã確ä¿ãããæãªã©çµ¶é ããè¦ãã ç ´æ£æ¸ã¿ã®ãªãã¸ã§ã¯ãã«æ» è¶è¦è¶ã«ãããã®ã好ãã å¿ æ»ã«å®ãã¯ãã ã£ãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ãè¤æ°ã¹ã¬ããã«è¹èºããä¸è²«æ§ãç¯ãããã¼ã¿ãå£ãã¦ããæ§ã¯ã¨ã¦ãã¨ã¦ãæ²ãããã®ã I/O層ã®é ãã«å¾éããã¦ã¿ã¤ã ã¢ã¦ãããã®ã好ãã ãã°ã¬ãã¼ãã«è¿½ãåããå»äººã®ããã«ãã¤ããªãçºããã®ã¯å±è¾±ã®æ¥µã¿ã 諸åãç§ã¯DBMããå°çã®æ§ãªDBMãæãã§ãã 諸åãä¼æ¥ã«ããæè¡ããã°ãèªã¿æ¼ãè¾£è ããã°ã©ã諸å åéã¯ä¸ä½ä½ãæãã§ããï¼ æ´ãªãDBMãæããï¼ ä¸»ãã¼ã§ããæ¤ç´¢ã§ããªãç³ã®æ§ãªDBMãæããï¼ ãã¼ã¿æé©åã®éããå°½ããRDBã®ãªããã£ãã¤ã¶ãåãåµã®æ§ãªæ§è½ãæããï¼ ï¼key-value! key-value! key-value! key-value! key-value! key-value!ï¼ ããããããªãã°DBMã æã ã¯æ¸¾èº«ã®ãã¹ããééãã¦ä»ã¾ãã«ãªãªã¼ã¹ãããã¨ããããã±ã¼ã¸ã ã ãããã®æãéã®åºã§8å¹´ãã®éå ªãç¶ãã¦ããæã ã«ãã ã®DBMã§ã¯ãã¯ã足ããªãï¼ï¼ ãªã¼ãã³ã½ã¼ã¹ãï¼ï¼ ä¸å¿ä¸ä¹±ã®ãªã¼ãã³ã½ã¼ã¹ãï¼ï¼ æãã¯ãããã«é±æ«ã¨å¤ãé±1000人æ¥ã«æºãã¬ããã¼ããã°ã©ãã«éããªã ã ã諸åã¯ä¸é¨å½åã®å¤å¼·è ã ã¨ç§ã¯ä¿¡ä»°ãã¦ãã ãªãã°æãã¯è«¸åã¨ç§ã§ç·å·¥æ°100ä¸ã¨1人æ¥ã®éçºéå£ã¨ãªã æã ãå¿å´ã®å½¼æ¹ã¸ã¨è¿½ãããç ãããã¦ããé£ä¸ãå©ãèµ·ããã ã½ã¼ã¹ã¢ã¼ã«ã¤ããè½ã¨ãtarã§éããmakeãããã é£ä¸ã«ãã«ãæéã®é ããæãåºããã¦ãã é£ä¸ã«åä½æéã®éããæãåºããã¦ãã ãã¼ã¨å¤ã®ã¯ãã¾ã«ã¯å¥´ãã®å²å¦ã§ã¯æãããããªãäºããããã¨ãæãåºããã¦ãã 10ä¸è¡ã®ã½ã¼ã¹ã³ã¼ãã®ã©ã¤ãã©ãªã§ä¸çãè¨é²ãå°½ããã¦ãã ããã ããããæã ãå¾ ã¡ã«æãã C++20ã®è¦æ ¼ã ç§ã¯è«¸åããç´æéãé£ãã¦å¸°ã£ããããã®æããã®å·¥ç¨ã¸ããã®æããã®DBM㸠(ããã¯ãªã¼ã殿ï¼CTO代è¡ï¼ä»£è¡æ®¿ï¼ãããã¯ãããã¼ã¸ã£æ®¿ï¼) ããã¦ãã©ã³ãã¯ã¤ãã«ãã¼ã¸ããã«ããªã¼ã¸ã¨ç»ã ã½ããã¦ã¨ã¢ã¨ã³ã¸ãã¢åå¡ã«ä¼éãä»æ§å¤æ´ã§ãã ããã諸å ã¨ãã£ã¿ãéãã
ãããªããã§ããã¤ã¦ã©ã¤ãã¯ã¼ã¯çã«ä½ã£ã¦ããDBMãä»é¢¨ã«ä½ãç´ãã¦ã¿ããã¨ã«ãããã³ããç¦ã®ä¸ãé±æ«ç¹ã«ãããã¨ããªãã®ã§ãã¾ãã¯ãã®è¨è¨ãããã«ã¡ã¢ãã¦ãããã¨æãã
ã¾ãã¯DBMã£ã¦ä½ãã¨ãããã¨ã ããDataBase Managerã®ç¥ã§ããããã¼ã¨å¤ãããªãé£æ³é åããã¡ã¤ã«ä¸ã«è¨é²ãããã®ã§ããããã¼ããªã¥ã¼ã¹ãã¢ã¨ãKVSã¨ãè¨ãããããããããããKVSã¨ããã¨ã³ã³ã»ããã¨ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ã¤ãã¦ã®è¨åã«ãªãããDBMã¨ããã¨ãã®ãã¼ã«ã«ãã¡ã¤ã«ä¸ã®å®è£ ã«ã¤ãã¦ã®è¨åã§ãããã¨ãå¤ãã ããããªãªã¸ãã«ã®DBMã¯ãã®ã±ã³ã»ãã³ãã½ã³ãå®è£ ãã¦ãã¦ãæå¿ã«ãã£ã¦NDBMãGDBMãSDBãTDBãBerkeley DBãªã©ãããããªæ¹è¯çãä½ããã¦ãããç§ãããã¤ãä½ã£ã¦ãã¦ãQDBMãTCãKCãçµã¦ãä»åã¯ãªãã¨4ä½ç®ã§ãããä»åã®ç®æ¨ã¯ä»¥ä¸ã®éãã
ã¾ã第ä¸ã«ãä»åã¯ãC++17ã«æºæ ããå®è£ ã«ãããã¨ããããC++17ã®æ°æ©è½ã®ä½¿ãããªããç·´ç¿ããéç¨ã§ãã®ä½æ¥ãè¡ããã¦ããããã¾ã«ã¯æ¨æºã©ã¤ãã©ãªããã·ãã·ä½¿ããªãã¨ã使ãæ¹ãå¿ãã¦ãã¾ãã®ã§ãC++20ã®æ©è½ã使ãããã¨ããã§ã¯ããããã¡ããå¤ãã®ç°å¢ã ã¨ã¾ã 使ããªãã®ã§ææ ¢ãUNIX-likeãªã·ã¹ãã ã§åä½ãããã¨ãåæã¨ããããI/O層ã®ä¸é¨ãããå¤ããã°Windowsçã®éPOSIXç°å¢ã«ã移æ¤ã§ããããã«ãããããããã¡ã¯char*ã¨size_tã§ç®¡çãã代ããã«std::stringãstd::string_viewãç©æ¥µçã«ä½¿ããã¹ã¬ããã¯std::threadãæä»å¶å¾¡ã¯std::mutexã¨std::shared_timed_mutexãã¢ãããã¯æ´æ°ã«ã¯std::atomic_intã使ããååã¯ããããPthreadãã¼ã¹ã®ã©ããã¼ã¯ã©ã¹ãèªåã§å®è£ ãã¦ãã¦æéã ã£ãããWindowsçã®ä½æãããªã大å¤ã ã£ããä»åã¯ä½æ°´æºãªé åã¯ã§ããã ãçååãã¦ããã£ã¨é«æ°´æºãªé åã追æ±ãããã
ã¹ã¬ãã並åæ§ãå人çã«å¥½ããªãããã¯ã ããã¼ã¿ãã¼ã¹å ¨ä½ã対象ã¨ããreader-writerããã¯ã§ç®¡çããã®ã¯ç°¡åã ãããããããªããã¤ã¾ãèªã¿è¾¼ã¿æä½ãè¡ãã¹ã¬ããå士ã¯åæã«åä½ã§ããããæ¸ãè¾¼ã¿æä½ãè¡ã£ã¦ããã¹ã¬ãããããã¨ãã®ä»ã®ã¹ã¬ããã¯ãããã¯ããã¦å¾ ããããä»æ§ã«ã¯ããªããKCã®æããããã ããæ¸ãè¾¼ã¿æä½ã®ã¹ã¬ããå士ãåæã«åä½ããããã«è¨è¨ããã³å®è£ ãããããããã¨å®è£ ãè¤éåããã®ã§ã·ã³ã°ã«ã¹ã¬ããã®ã¹ã«ã¼ãããã¯ä¸ããã®ã ãããã«ãã¹ã¬ããã®ã¹ã«ã¼ãããã¯åä¸ãããCPUã®ã¯ããã¯å¨æ³¢æ°ãé æã¡ã«ãªã£ã代ããã«ãã«ãã³ã¢æè¡ãé²å±ããæè¿ã®ã«ã¼ãã«ã ã¨ã¹ã¬ããçæã³ã¹ããå®ããªããããã«SSDçã®ç»å ´ã§ã¹ãã¬ã¼ã¸ã®é度ãä¸ãã£ã¦ãããã¯ã©ã¦ãæ代ã¨ãã£ã¦ãããã¼ã«ã«ãã·ã³ã¬ãã«ã®ä¸¦åæ§ãéè¦ãªã®ã ãDBMã使ãã¨ããããããããã«ããã¯ã«ãªããªãããã«é æ ®ããããã®ã ã
å ç¢æ§ã«ã¤ãã¦ã ããä»åã¯ãã¤ã³ãã¬ã¼ã¹æ´æ°ã¨è¿½è¨æ´æ°ã¨ããäºã¤ã®ã¢ã¼ããç¨æãããã¨ã«ãããæ¢åã®ã¬ã³ã¼ããæ´æ°ãããåé¤ãããããã«ããããã¤ã³ãã¬ã¼ã¹æ´æ°ã¯ããã®æ¢åã®ã¬ã³ã¼ãã®ä¿åé åãæ¸ãæãããä¸æ¹ã§è¿½è¨æ´æ°ã§ã¯ãæ°ããªãã¼ã¿ããã¡ã¤ã«ã®æ«å°¾ã«è¿½è¨ãããã¤ã³ãã¬ã¼ã¹æ´æ°ã¯ç©ºéå¹çãè¯ããããã¼ã¿ã®æ´æ°ä¸ã«ããã»ã¹ãæ»ã¬ã¨ãã¼ã¿ãå£ããå¯è½æ§ãããã追è¨æ´æ°ã¯ãã¼ã¿ãåé¤ããæã§ãããã¡ã¤ã«ãµã¤ãºãå¢ããã¨ãã空éå¹çã®æªããæã¤ãããã¼ã¿ãå£ãããã¨ã¯æ±ºãã¦ãªããã¤ã³ãã¬ã¼ã¹æ´æ°ã¨è¿½è¨æ´æ°ã®ã©ã¡ããè¯ããã¯ã¦ã¼ã¹ã±ã¼ã¹ã«ãããä»ã¾ã§ã¯ã¤ã³ãã¬ã¼ã¹æ´æ°ã®ã¿ãå®è£ ãã¦ããããä»åã¯è¿½è¨æ´æ°ããµãã¼ããããã®å®ç¨çãªå¹çæ§ãããããé«ãã¨ãããã¨ã示ãããã
ä»æ§ã¯åç´åãããæ©è½ãå¤ãã»ã©ã«ã¡ã³ããã³ã¹æ§ãä¸ããããã ãKCã§ã¯å§ç¸®ã¹ãã¬ã¼ã¸ããæå·ã¹ãã¬ã¼ã¸ãããã©ã³ã¶ã¯ã·ã§ã³ããã¹ãããã·ã§ããããã®æ©è½ã追å ãã¦ãã£ãããä»åã¯ããããã®ã¯çãããã ããã¼ã¨å¤ã®ãã¢ãä¿åã§ããã ãã®åãªãDBMãå®è£ ããããã¨ãKCã§å¾æãããã¨ã®ä¸ã¤ã§ãããããã·ã¥ãã¼ãã«ã¨äºåæ¢ç´¢æ¨ãä½µç¨ãããã¼ã¿æ§é ãæ¹ãã¦ãããã·ã¥ãã¼ãã«ã¨ç·å½¢é£çµãªã¹ãã«åç´åãããããã·ã¥å¤ã®è¡çªæã«äºåæ¢ç´¢ãã§ããæ¹ãææªè¨ç®éã®ä¿è¨¼ãã§ãã¦è¯ãã¨èããã®ã ããããã«ãã£ã¦å¤±ããã®ãå¤ãããããã¼ã¿æ§é ãåç´åãã¤ã¤ããã¼ãã«ããã¯ããããã«ãªããã·ã¥ã§ããä»çµã¿ã模索ããæ¹ãè¯ããã ã
ä»ã¾ã§ã¯èªåã§ãã¹ããã¼ã«ãå®è£ ãã¦ããããä»åã¯Google Testã¨ãã®ãã¹ãã¹ã¤ã¼ãã使ã£ã¦å¹çåããããã¡ã¤ã«IO層ããããã¯ã¹ãã¬ã¼ã¸å±¤ãDBM層ã®ä¸å±¤ã§ç¬ç«ãã¦ãã¹ãã§ããããã«ããã ãããã¨ããããåä½ç°å¢ã¯UNIXç³»ï¼ã¨ãããLinuxã¨Mac OS Xï¼ã ãã«éå®ãããWinç³»ã§ãå°æ¥çã«ã¯åãã¨ãããã©ãå½é¢ã¯æ°ã«ããªãããããããAndroidãiOSã§ã®åä½ãæ°ã«ãããã¨ããã ã
DBMã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«åããã¦è¤æ°ã®å®è£ ã¯ã©ã¹ãæä¾ããããããããç°ãªããã¼ã¿æ§é ã¨ã¢ã«ã´ãªãºã ã§ãããã¦ã¼ã¹ã±ã¼ã¹ã«ãã£ã¦ä½¿ãåãããã¨ã«ãªãã
ã¯ã©ã¹å | è¨æ¶åªä½ | ã¢ã«ã´ãªãºã | é åº | æéè¨ç®é | 並åæ§ |
HashDBM | ãã¡ã¤ã« | ããã·ã¥ãã¼ãã« | ãªã | O(1) | ã¬ã³ã¼ãæ¯ã®RWãã㯠|
TreeDBM | ãã¡ã¤ã« | B+æ¨ | ãã | O(log N) | ãã¼ã¸æ¯ã®RWãã㯠|
SkipDBM | ãã¡ã¤ã« | ã¹ããããªã¹ã | ãã | O(log N) | å ¨ä½ã®RWãã㯠|
TinyDBM | ãªã³ã¡ã¢ãª | ããã·ã¥ãã¼ãã« | ãªã | O(1) | ã¬ã³ã¼ãæ¯ã®RWãã㯠|
BabyDBM | ãªã³ã¡ã¢ãª | B+æ¨ | ãã | O(log N) | ãã¼ã¸æ¯ã®RWãã㯠|
KCã¨ã®éãã¨ãã¦ã¯ãå ¨ä½ã®æ§è½ãæ©è½æ§ãä¿¡é ¼æ§ãä¸ãã£ã¦ããã¹ããã¨ã®ä»ã«ã以ä¸ã®ç¹ãæããããã
- HashDBMã§è¿½è¨æ¸ãè¾¼ã¿ã¢ã¼ããå®è£ ãã
- HashDBMã¨TreeDBMã®åæ§ç¯ããã³ããããã³ã°ã«ãã
- TreeDBMã®ä¸¦åæ§ããã¼ãã«ããã¯ãããã¼ã¸ããã¯ã«æ ¼ä¸ããã
- HashDBMããªã³ã¡ã¢ãªã«ããTinyDBMãå®è£ ãã
- TreeDBMããªã³ã¡ã¢ãªã«ããBabyDBMãå®è£ ãã
- é åºã¢ã¯ã»ã¹å¯¾å¿ã§TreeDBMããã¹ã±ã¼ã©ãã«ãªå®è£ ã¨ãã¦ãã¹ããããªã¹ãã«åºã¥ãSkipDBMãå®è£ ãã
ãããã¦æ¸ãåºãã¦ã¿ãã¨ããªããªã大å¤ãããªè¨ç»ã§ãããã§ãå¤åå®ç¾ã§ããã ãããã»ã¨ãã©ã®æè¡ç課é¡ã¯ä½åº¦ãçµé¨ãã¦ãããã®ã ããã ãä¸ç°è°·å ¬åãã¸ã§ã®ã³ã°ãã¤ã¤ãè¨è¨ãæ¢ã«åºãã¦ãããé ã®ä¸ã§ã§ãã¦ãã£ã¦ãã¨ã¯ããã¨ã¯æãåããã ãã ã
ä½è«ãKCã®ã¡ã³ãã ããéç¨å¥ç´ã®é¢ä¿ã§ããæ´æ°ã§ããªãã®ãå®æ ã ããããã大人ã®äºæ ããã£ã¦ããä»åã¯ãããªããªãããã«ãã¾ããã¨é²ããæåã