ãã¡ã¤ã«ã·ã¹ãã ã®ãã£ãã·ã¥æ©æ§ãä»ããã«ã¹ãã¬ã¼ã¸ããã¤ã¹ã«å¯¾ãã¦ç´æ¥å
¥åºåãè¡ãæ©è½ããã¤ã¬ã¯ãI/Oãªã©ã¨è¨ã£ããããããããããã¼ã¿ãã¼ã¹ã©ã¤ãã©ãªTkrzwããã使ããããã«ãããLinuxã¨Windowsã§ä½¿ããããã®åæã¨ãã¦ãã¢ãã¬ã¹ã¨ãµã¤ãºãã¢ã©ã¤ã³ã¡ã³ããããã¡ã¢ãªç©ºéã¨ã®ã¹ãã¬ã¼ã¸ããã¤ã¹ã®éã§ã®ãã¼ã¿è»¢éã«éå®ãããããã¯I/Oãå®ç¾ããå¿
è¦ããã£ãããã®è¦å´è©±ã¨æ§è½è©ä¾¡ãèªããã
ä¸ã«ããã»ã¼å ¨ã¦ã®ã¹ãã¬ã¼ã¸ããã¤ã¹ã¯ãé£æ¥ãããã¼ã¿ãä¸å®ã®ãµã¤ãºã§ã¾ã¨ãã¦æ ¼ç´ãããããã¯åä½ã®å ¥åºåãå®ç¾ãããã¼ãã¦ã§ã¢ã§ãããä¸ã®å³ãè¦ã¦ã»ããããã¡ã¤ã«ã·ã¹ãã ã¯ãä¸å±¤ã®ã¹ãã¬ã¼ã¸ããã¤ã¹ã®å·®ç°ãé è½ãã¦ãä»»æã®ãµã¤ãºã®ãã¼ã¿ããã¡ã¤ã«ã¨ãã¦èªã¿æ¸ãããæ©è½ãæä¾ãã¦ããããããããããã¾ã§OSã¨ã¹ãã¬ã¼ã¸ããã¤ã¹ã®éã®ãã¼ã¿è»¢éã¯ãããã¯åä½ã§è¡ãããããããã¯ãµã¤ãºã¯ããã¤ã¹ã«ãã£ã¦æ§ã ã§ã512ãã¤ãã1024ãã¤ãã4096ãã¤ãã65536ãã¤ããªã©ãããå¾ããããã«ãã¹ãã¬ã¼ã¸ããã¤ã¹ä¸ã§ã¯è¤æ°ãããã¯ãã»ã¯ã¿ã¼åä½ã«ã¾ã¨ãã¦ç®¡çããã¦ããããããããããç©ççã«ã©ããªã£ã¦ãããã¯å®å ¨ã«ãã¼ãã¦ã§ã¢ã®è£½åä¾åã ããããã¤ã¹ãã©ã¤ãã¯ãããã¯åä½ã®è»¢éã«å°å¿µãããã¨ã§è©³ç´°ãé è½ãã¦ãããã
ãã¡ã¤ã«ã·ã¹ãã ä¸ã§ã¯ãå ¥åºåã®å¯¾è±¡ã¨ãªããã¼ã¿ã®ã¾ã¨ã¾ãã¯ããã¼ã¸ã¨ãã¦ç®¡çããããåãã¼ã¸ã¯ã¡ã¢ãªä¸ã®é£æ¥ãããã¤ãã§ãããå¤ãã®å ´å4096ãã¤ãã§ããããã¼ã¸ã¯ãããã¡ã¨ããã£ãã·ã¥ã¨ãã¨ãå¼ã°ãããreadã·ã¹ãã ã³ã¼ã«ãçºè¡ãããéã«ã¯ã該å½ã®ãããã¯ç¾¤ããã¼ã¸ã«èªã¿åºããããã§ã«ã¡ã¢ãªä¸ã«ããã°åå©ç¨ãããã®ãã¼ã¿ã®ä¸é¨ãã¦ã¼ã¶ããã»ã¹ã®ãããã¡ä¸ã«è¤è£½ãããwriteã·ã¹ãã ã³ã¼ã«ãçºè¡ãããéã«ã¯ã該å½ã®ãããã¯ç¾¤ããã¼ã¸ã«èªã¿åºããããã§ã«ã¡ã¢ãªä¸ã«ããã°åå©ç¨ãããã®ä¸é¨ã«ã¦ã¼ã¶ã¼ããã»ã¹ã®ãããã¡ãããã¼ã¿ãè¤è£½ãããwriteã«ãã£ã¦æ´æ°ããããã¼ã¸ã¯ãã¼ãã£ãã¼ã¸ã¨å¼ã°ãããããã¼ãã£ãã¼ã¸ã¯å³åº§ã«ããã¤ã¹ã«æ¸ãæ»ãããããã§ã¯ãªããä¸é£ã®æ´æ°ãã¾ã¨ãã¦ããã¤ã¹ã«è»¢éããæ¹ãæ§è½ä¸æå©ã ããã ãå ¸åçã«ã¯ãä¸å®ã®æéãçµéãããããã£ãã·ã¥ç¨ã«å²ãå½ã¦ãããã¡ã¢ãªãæ¯æ¸ãã¦ããå ´åã«ããã¼ãã£ãã¼ã¸ã¯ããã¤ã¹ã«æ¸ãæ»ããããæ¸ãæ»ããããã¼ã¸ã¯ã¾ãã¯ãªã¼ã³ãªãã¼ã¸ã«æ»ããã¯ãªã¼ã³ãªãã¼ã¸ã¯ãã¤ç ´æ£ããã¦ãæ§ããªãã®ã§ãå ¸åçã«ã¯LRUï¼ï¼æçµå©ç¨ãæãå¤ããã®ï¼ãªãã¼ã¸ããç ´æ£ããããã¨ã§ããã£ãã·ã¥ã®ã¡ã¢ãªä½¿ç¨éã¯ä¸å®ã«ä¿ãããã
ãã¤ã¬ã¯ãI/Oã¨ã¯ããã¡ã¤ã«ã·ã¹ãã ã®ãã£ãã·ã¥ã«ã¢ã¯ã»ã¹ããã«ãã¹ãã¬ã¼ã¸ããã¤ã¹ã®ãã©ã¤ãã¨ã®éã§ç´æ¥ãã¼ã¿ãèªã¿åºãããæ¸ãåºãããããææ³ã ããã¡ã¤ã«ã·ã¹ãã ããã£ã¦ãããã¨ãã¦ã¼ã¶ããã»ã¹å´ã§ä¸é¨è©ä»£ããããææ³ã¨ãè¨ãããå½ç¶ãããã¯I/Oãåæã¨ãªãããããªãã¨ããã¦ä½ãå¬ããã®ããこのIBMの解説ããããããããè¦ããã«ããã£ãã·ã¥ã®ãããçãä½ããã¦æ§è½ä¸ã®å©ç¹ããªãå ´åã«ã¯ããã£ãã·ã¥ã¯åã«ã¡ã¢ãªã¨CPUã®ç¡é§é£ãã«ãªãã®ã§ãããã¤ã¹ã¨ç´æ¥ããã¨ãããæ¹ãå¾ã ã¨ãããã¨ã ãã§ã¯ããã£ãã·ã¥ã®ãããçãä½ããªãã®ã¯ã©ããªå ´åãã¨ããã¨ã巨大ãªãã¡ã¤ã«ä¸ã®ã©ã³ãã ã¢ã¯ã»ã¹ãè¡ãå ´åã ãä¾ãã°ã256GBã®ãã¡ã¤ã«ã®ã©ã³ãã ã¢ã¯ã»ã¹ãè¡ãã¨ãã¦ããã£ãã·ã¥ã«8GBã®ã¡ã¢ãªã使ãã¨ãããããããçã¯3%ã»ã©ã«ãªããã¤ã¾ã97%ã®ã¢ã¯ã»ã¹ã§ã¯ããã£ãã·ã¥ä¸ã®æ¢åã®ãã¼ã¸ã«ãããããªãã®ã§ãæ°ãããã¼ã¸ããã£ãã·ã¥ã«ãã¼ããããããã®ãã¼ã¸ã¯ã»ã¨ãã©åå©ç¨ãããªãã§ãçæéã§æ¸ãæ»ããããåã«æ¨ã¦ãããã®ã ãå®éã®ã¨ããããã¡ã¤ã«ã·ã¹ãã ã¯ã·ã¹ãã ä¸ã®ä½å°ã¡ã¢ãªãå
¨ã¦ä½¿ã£ã¦é«éåãå³ãã®ã§ããããªä¸ã§å·¨å¤§ãã¡ã¤ã«ã®ã©ã³ãã ã¢ã¯ã»ã¹ãè¡ãã¨ãåã«ä½å°ã¡ã¢ãªãæ¯æ¸ãã¦ã·ã¹ãã ãé
ããªãã ãã ã
ãã¤ã¬ã¯ãI/Oã使ãã°ããã£ãã·ã¥ç¨ã®ã¡ã¢ãªã確ä¿ãããããã£ãã·ã¥ã¨ã®éã®ãã¼ã¿è»¢éã«ãããCPUè² è·ãçãã¦ãã¹ãã¬ã¼ã¸ã¨ã®éã®å¹ççãªå ¥åºåãè¡ããã¨ãã§ãããpreadãpwriteã¨ãã£ãã·ã¹ãã ã³ã¼ã«ã®å¿çã¯ããã¤ã¹ãã©ã¤ãã®å¿çã«å¾éããã¦é ããªãããã ãããã£ãã·ã¥ãå¹ççã«å¹ãã¦ããã¨ãã®éç¨ã®I/Oããã¯é¥ãã«é ããããã£ãã·ã¥ãå¹ççã§ãªãã¨ãã®é常ã®I/Oããã¯å¤§åãã·ãªæ§è½ã«ãªãã
ç¾ç¶ã§ã¯ãLinuxã¨Windowsã§ã®ã¿ãã¤ã¬ã¯ãI/Oã«å¯¾å¿ãã¦ãããLinuxä¸ã§ã¯ãopenã·ã¹ãã ã³ã¼ã«ã«O_DIRECTã¨ãããã©ã°ãã¤ããã¨ãã¤ã¬ã¯ãI/Oãè¡ãããã«ãªãããããã¤ããã ãã§ãã«ã¼ãã«å é¨ã§ãã¡ã¤ã«ã·ã¹ãã ã®ãã£ãã·ã¥æ©æ§ãåé¿ãã¦ãç´æ¥ããã¤ã¹ãã©ã¤ãã¨ã®éã§ãã¼ã¿è»¢éãè¡ããããã«ãªããããã¤ã¹ãã©ã¤ããããããæ¸ããªãã¦ããpreadãpwriteãªã©ã®POSIXæ¨æºAPIã§å©ç¨ã§ããã¨ããã¨ãããç´ æ´ãããããã ãã以ä¸ã®å¶éãããã
- ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã¯O_DIRECTãã¤ãã¦éããã¦ããã
- 転éãµã¤ãºã512ãã¤ãã®åæ°ã§ããã
- ãã¡ã¤ã«ä¸ã®è»¢ééå§ä½ç½®ã512ã®åæ°ã«ã¢ã©ã¤ã³ã¡ã³ãããã¦ããã
- 転éå ã転éå ã®ãããã¡ã®ã¢ãã¬ã¹ã512ã®åæ°ã«ã¢ã©ã¤ã³ã¡ã³ãããã¦ããã
ã¤ã¾ãã以ä¸ã®preadã¨pwriteã®ã·ã°ããã£ã«ããã¦ã¯ããã®å¶éã¯ããè¨ããããããã
ssize_t pread(int fd, void *buf, size_t count, off_t offset); ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
- fdã¯O_DIRECTãã¤ãã¦openããããã®
- buf % 512 == 0
- count % 512 == 0
- offset % 512 == 0
ãããã¯ãµã¤ãºã¯512ãæä½éã«è¨å®ããã¦ããããå®éã®ããã¤ã¹ã®ãããã¯ãµã¤ãºã«åãããæ¹ãé«æ§è½ã«ãªããããããããã«ãããã¢ããªã±ã¼ã·ã§ã³å´ã§ãã¡ã¤ã«ã·ã¹ãã ã®çä¼¼äºãããªããã°ãªããªããããããããã¯I/Oã¨å¼ã¼ãããã¤ã¬ã¯ãI/Oãæå®ãããããªããã¨ã¯ç¬ç«ãã¦ãã¨ãããããããã¯I/Oãå®è£ ãã¦ããã°ãæ½°ããå¹ãããã ããããã¯I/Oã§ã¯ã512ãã¤ãæªæºã®ãã¼ã¿ãèªã¿è¾¼ãã¨ãã¦ãã該å½ãããã¯ã®512ãã¤ããå ¨ã¦èªã¿è¾¼ãã§ããç¹å®é¨åãåãåºããã°ãªããªãã512ãã¤ãæªæºã®ãã¼ã¿ãæ¸ãè¾¼ãå ´åã該å½ãããã¯ã®512ãã¤ãããããã¡ä¸ã«èªã¿è¾¼ãã§ãããç¹å®é¨åãæ¸ãæãã¦ãå ¨ä½ãæ¸ãæ»ããã°ãªããªããè¤æ°ãããã¯ã«ã¾ãããå ´åãåæ§ã ããããã¡ã®ã¢ãã¬ã¹ã512ãã¤ãã«ã¢ã©ã¤ã³ã¡ã³ãããã¦ããªããã°ãªããªãããããã¯前回述べたalloc_alignedã使ã£ã¦è¡ãã
Windowsä¸ã§ã¯ãCreateFileã®ãã©ã°ã«FILE_FLAG_NO_BUFFERINGãã¤ããã¨ãO_DIRECTã¨åæ§ã®å¹æãå¾ãããããªãã»ããã¨ã¢ãã¬ã¹ã¨ãµã¤ãºã«512ãããã¯ãã以ä¸ã®ã¢ã©ã¤ã³ã¡ã³ãå¶ç´ããããã®ãåãã§ããã
Linuxã¨Windowsã®ç´°ããå·®ç°ã¨ãã¦ããã¡ã¤ã«ãµã¤ãºãã¢ã©ã¤ã³ã¡ã³ããããããæãããããLinuxã®å ´åãftruncateã¯O_DIRECTã®å½±é¿ãåããªãã®ã§ããã¡ã¤ã«ãµã¤ãºãä»»æã«èª¿æ´ã§ãããWindowsã®SetEndOfFileã§ã¯ãã¢ã©ã¤ã³ã¡ã³ãããããµã¤ãºã«ãã調æ´ã§ããªãããã£ã¦ãWindowsã§ãã¤ã¬ã¯ãI/Oã®ãã¡ã¤ã«ã®ãµã¤ãºãã¢ã©ã¤ã³ã¡ã³ãå¤ã«èª¿æ´ããã«ã¯ãä¸æ¦ãã¡ã¤ã«ãéãã¦é常ã¢ã¼ãã§éãç´ãã¦ããSetEndOfFileãå¼ã¶å¿ è¦ãããã
以ä¸ã®ãããªåªåãå ¨ã¦å é¨ã§é è½ãã¦è¡ããããããæ®éã®ãã¡ã¤ã«ã®ããã«ä½¿ããæ©è½ããã¡ã¤ã«ã¯ã©ã¹PositionalParallelFileã«å®è£ ãããã¢ããªã±ã¼ã·ã§ã³å´ã¯ããããã¯ãæ°ã«ãããã¨ãªããä»»æã®ãªãã»ããã«ä»»æã®é·ãã®ãã¼ã¿ãèªã¿æ¸ããããã¨ãã§ãããDBMã使ããªãã§ãã®ãã¡ã¤ã«ã¯ã©ã¹ã使ãã ãã§ãTkrzwã使ã価å¤ãããããããªé¢¨ã«æ®éã«ä½¿ããã
PositionalParallelFile file; file.SetAccessStrategy(512, PositionalParallelFile::ACCESS_DIRECT).OrDie(); file.Open("sample.txt").OrDie(); file.Write(0, "12345", 5).OrDie(); file.Write(5, "abcde", 5).OrDie(); char buf[6]; file.Read(2, buf, 6).OrDie(); std::cout << std::string(buf, 6) << std::endl; // -> "345abc" file.Close().OrDie();
SetAccessStrategyã§ã2以ä¸ã®ãããã¯ãµã¤ãºãæå®ããã¨ããããã¯I/Oãæå¹ã«ãªããã¾ãããªãã·ã§ã³ã§ãACCESS_DIRECTãæå®ããã¨ããã¤ã¬ã¯ãI/Oãæå¹ã«ãªãããããã¯ãµã¤ãºã1ã¨ã512æªæºã«ãã¦ããã¤ã¬ã¯ãI/Oãæå¹ã«ãããã¨ãè«ççã«ã¯å¯è½ã ããå¾ã§ã¨ã©ã¼ã«ãªãã ãã ããããã¯ãµã¤ãºãããã¤ã¹ã®ç¹æ§ã«å¿ãã¦1024ã¨ã2048ã¨ãã«ããä½å°ã¯ããããªãã·ã§ã³ã«ã¯ACCESS_SYNCã¨ããã®ãè«çåã§å ãããããããã®å ´åã«ã¯O_SYNCãã©ã°ï¼Windowsã§ã¯FILE_FLAG_WRITE_THROUGHãã©ã°ï¼ã«ãã£ã¦ãå ¨ã¦ã®æ¸ãè¾¼ã¿æä½ããã¼ãã¦ã§ã¢ã®åæå®äºéç¥ã¾ã§å¾ ããããã
Tkrzwã®å ¨ã¦ã®ãã¼ã¿ãã¼ã¹ã¯ã©ã¹ã¯ãã¤ã¾ããHashDBMï¼ããã·ã¥ãã¼ã¿ãã¼ã¹ï¼ãTreeDBMï¼B+æ¨ãã¼ã¿ãã¼ã¹ï¼ãSkipDBMï¼ã¹ããããªã¹ããã¼ã¿ãã¼ã¹ï¼ããä»»æã®ãã¡ã¤ã«å®è£ ã¯ã©ã¹ãæ³¨å ¥ãã¦å©ç¨ã§ããããã«ãªã£ã¦ããããããã£ã¦ããã¤ã¬ã¯ãI/Oã«åºã¥ããã¡ã¤ã«ã®å®è£ ã¯ã©ã¹ããæºåããã°ããã¹ã¦ã®ãã¼ã¿ãã¼ã¹ã§ãã¤ã¬ã¯ãI/Oãå©ç¨ã§ããããã«ãªãããªãã¸ã§ã¯ãæåä¸æ³ã
å®éãACCESS_DIRECTãªãã·ã§ã³ãæå¹ã«ãããã¡ã¤ã«ãªãã¸ã§ã¯ããçµã¿è¾¼ãã ã ãã§ãã»ã¨ãã©ã®ãã¹ãã±ã¼ã¹ãéã£ã¦ãã¾ã£ãããã ãããã¤ããã¼ã¿ãã¼ã¹å´ã§å¯¾å¿ããªããã°ãªããªããã¨ããã£ãããã¡ã¤ã«ãµã¤ãºã512ãã¤ãã®åæ°ã¨ã¯éããªããã¨ã ããã®å ´åããã¡ã¤ã«ã®æ«å°¾ã®æå¾ã®512åãã¤ãã®ä½ç½®ãããå¾ãã¯ãèªããªããªã£ã¦ãã¾ããæ¸ãè¾¼ã¿ã¢ã¼ãã®å ´åã«ã¯ã次ã®512åãã¤ãã¾ã§ftruncateã§ãã¡ã¤ã«ãæ¡å¼µããã°èªããããã«ãªãããèªã¿è¾¼ã¿ã¢ã¼ãã®å ´åã«ã¯ããã¯ãããªãããã£ã¦ããã¤ã¬ã¯ãI/Oã¢ã¼ãã§æ¸ãè¾¼ã¿ãè¡ãå ´åã«ã¯ããã¼ã¿ãã¼ã¹ã¯ã©ã¹ã®è²¬ä»»ã§ãããã£ã³ã°ãã¼ã¿ãåãã¦ããã¡ã¤ã«ãµã¤ãºã512ã®åæ°ã«ãªãããã«ããªããã°ãªããªãããã¡ã¤ã«ã¯ã©ã¹ã®è²¬ä»»ã§åæã«ããã£ã³ã°ãã¼ã¿ãåããã¨ããã¼ã¿ãã¼ã¹ã¯ã©ã¹ãç¥ããªãè¬ãã¼ã¿ã§ãã¡ã¤ã«ãæ¹ç«ããã¦ããæ±ãã«ãªã£ã¦ãã¾ãã®ã§ãããã¾ã§ãã¼ã¿ãã¼ã¹å´ã§å¯¾å¿ããå¿ è¦ããããã©ã®ãã¼ã¿ãã¼ã¹ã¯ã©ã¹ã§ããæ¤ç´¢ç¨ã®ãããã¯ãã§ã¼ã³ã«ã¤ãªãããªãããã¼ã®ãã¼ã¿ãæ«å°¾ã«åãããã¨ã§å¯¾è±¡ã§ããã
æ§è½ä¸ã®å·¥å¤«ããããHashDBMã¯ã¬ã³ã¼ãã®ã¤ã³ããã¯ã¹ãåããããã·ã¥ãã¼ãã«ããã¡ã¤ã«ã®å é ã«ç½®ãã¦ä½¿ã£ã¦ãããB+æ¨ãæ±ãTreeDBMã§ããã¼ã¸ãã¼ã¿ã®ç®¡çã«HashDBMã使ã£ã¦ãããã¨ããã§ã4ãã¤ãã®åºå®é·æ°å¤è¡¨ç¾ã®é åã§ããããã·ã¥ãã¼ãã«ã®èªã¿æ¸ããããå ´åããã£ã4ãã¤ããæä½ããããã«512ãã¤ãã®èªã¿æ¸ããå¿ è¦ã¨ãªããããã¯æ¯åã®ã¬ã³ã¼ãæä½ã§è¡ããããããé常ã«å¹çãæªãããã£ã¦ããã¡ã¤ã«ã®å é ã®æå®ãããµã¤ãºã«éå®ãã¦ãããã¡ãªã³ã°ãè¡ãæ©è½ãã¤ãããSetHaedBuffer(8192)ã¨ãããã¨ããã¡ã¤ã«ã®å é 8192ãã¤ãã«ç¸å½ãããããã¯ãèªã¿åºãããããã¡ãä½ãã以å¾ãã®é åã«è©²å½ããèªã¿æ¸ãã¯ãã®ãããã¡ã対象ã¨ãã¦è¡ãããããã¡ãããé åã¯ãSynchronizeã¡ã½ãããCloseã¡ã½ãããå¼ã°ããéã«ã®ã¿ããã¡ã¤ã«ã«æ¸ãæ»ãããã
ãããã¯I/Oã®ãããã§ã512ãã¤ãã«ã¢ã©ã¤ã³ã¡ã³ããããªãèªã¿æ¸ããééçã«è¡ããããã«ãªã£ããããããå®éã«ã¯512ãã¤ãã«ã¢ã©ã¤ã³ã¡ã³ãããã¦ããæ¹ãå¹ççãªããã§ããã¼ã¿ãã¼ã¹å´ã«ãã¢ã©ã¤ã³ã¡ã³ãæ©è½ãããã¨æã¾ãããããã¦ããããªãã¨ãããããã¨ãTkrzwã®è¨è¨æããã¢ã©ã¤ã³ã¡ã³ãæ©è½ã¯çµã¿è¾¼ã¾ãã¦ãããalign_powã¨ãããã¥ã¼ãã³ã°ãã©ã¡ã¼ã¿ã¯ããã©ã«ãã§3ã«ãªã£ã¦ãããããã¯å ¨ã¦ã®ã¬ã³ã¼ãã®ãã¼ã¿ã®ãªãã»ããã2^3=8ãã¤ãã®åæ°ããå§ã¾ããã¨ãæå³ãã¦ãããããã9ã«ããã°ã2^9=512ãã¤ãã«ã¢ã©ã¤ã³ã¡ã³ããããã¨ããããã ããã ãããã®å ´åããã¼ã¨å¤ã¨ã¡ã¿ãã¼ã¿ã®åè¨ãµã¤ãºã512ãã¤ãããéãã«å°ããã±ã¼ã¹ã§ã常ã«512ãã¤ãã®é åãå°æãããã¨ã«ãªãããªã®ã§ãå®éã®ã¢ã©ã¤ã³ã¡ã³ããããã¤ã«ãããã¯ãã©ããªãã¼ã¿ãæ ¼ç´ãããã«ãããå¹³å10KBã¨ãã®ãã¼ã¿ãå ¥ããã®ã§ããã°ã2^10=1024ãã¤ãããã以ä¸ã«ã¢ã©ã¤ã³ã¡ã³ããã¦ãããã ãããå¹³å1KBæªæºã§ããã°ã2^8=256ãã¤ãããããããã ããããã ããã¢ã©ã¤ã³ã¡ã³ãããããã¯ãµã¤ãºããä½ããã¤ãã«ãã¹ã¬ããã§ã¢ã¯ã»ã¹ããå ´åãPositionalParallelFileã¯ã©ã¹ã§ãªãPositionalAtomicFileã¯ã©ã¹ã使ãå¿ è¦ãããããªããªããDB層ã¯ã¢ã©ã¤ã³ã¡ã³ãã®åä½ã§ã¹ã¬ããéã®ä¸è²«æ§ãä¿è¨¼ããã®ã§ããã¡ã¤ã«å±¤ã®ãããã¯ç®¡çã®é½åã§ã¢ã©ã¤ã³ã¡ã³ãå¢çãè·¨ãã æä½ãæé»çã«è¡ãããã¨ã¹ã¬ããã»ã¼ãã§ãªããªãããã ã
æ¹ãã¦çæãã¹ãã¯ãDB層ã®ã¢ã©ã¤ã³ã¡ã³ãã¨ãã¡ã¤ã«å±¤ã®ãããã¯ãµã¤ãºã¯ç¬ç«ãã¦ããã¨ãããã¨ã ãDB層ã®ã¢ã©ã¤ã³ã¡ã³ãããã¡ã¤ã«å±¤ã®ãããã¯ãµã¤ãºã¨åãã§ããã®ã¯æ§è½çã«çæ³ã ããå¿ ãããåãã§ããå¿ è¦ã¯ãªãã空éå¹çã¨æéå¹çã®ãã¬ã¼ããªããèãã¦è¨å®ãã¹ãã ãããã«è¨ãã°ããã¡ã¤ã«å±¤ã®ãããã¯ãµã¤ãºã¯ããã¤ã¹ã®ãããã¯ãµã¤ãºã¨åãã§ãããã¨ãæã¾ããããå¿ ãããåãã§ããå¿ è¦ã¯ãªããLinuxã¨Windowsã§ã¯æä½512ãã¤ãã¨ããå¶éãããã ãã ãå®éã®ãããã¯ãµã¤ãºã¨æ§è½ã®é¢ä¿ã¯ããã¤ã¹æ¯ã«ç°ãªãã®ã§ãåã 人ã®ç°å¢ã§ãã³ããã¼ã¯ãåã£ã¦æé©ãªè¨å®ãæ¢ããããªãã
以ä¸ãè¸ã¾ãã¦ããã¼ã¿ãã¼ã¹ã§ãã¤ã¬ã¯ãI/Oãæ´»ç¨ãããµã³ãã«ã³ã¼ãã¯ä»¥ä¸ã®ããã«ãªãã
# ãã¤ã¬ã¯ãI/Oã¢ã¼ãã®ãã¡ã¤ã«ãåãè¾¼ãã ãã¼ã¿ãã¼ã¹ãä½ã auto file = std::make_unique<PositionalParallelFile>() file->SetAccessStrategy( 512, PositionalFile::ACCESS_DIRECT | PositionalFile::ACCESS_PADDING).OrDie(); HashDBM dbm(std::move(file)); # ã¢ã©ã¤ã³ã¡ã³ãã¨ãã±ãããã£ãã·ã¥ãè¨å®ãã¦DBãéã HashDBM::TuningParameters params; params.align_pow = 8; params.cache_buckets = true; dbm.OpenAdvanced("sample.tkh", true, params).OrDie(); # æ®éã«èªã¿æ¸ããã dbm.Set("japan", "tokyo").OrDie(); dbm.Set("china", "beijing").OrDie(); dbm.Set("korea", "seoul").OrDie(); std::cout << dbm.GetSimple("japan") << std::endl; # ãã¼ã¿ãã¼ã¹ãéãã dbm.Close().OrDie();
ãã¡ãç°¡åã ããããã¤ã¬ã¯ãI/Oãªãã¦æ¬æ¥ã¯ãã£ã¡ãé¢åãªã®ã«ãããã¦ãã©ã¤ãã©ãªãããã°ããããªã«ç°¡åã«å©ç¨ã§ãã¦ãã¾ãã®ã ããã¡ã¤ã«ã¯ã©ã¹ãé è½ãã¦ããããããã§ãªãã»ãããã¢ãã¬ã¹ã®ã¢ã©ã¤ã³ã¡ã³ããªãã¦èããªãã¦ãããããããããã¼ã¿ãã¼ã¹ã¯ã©ã¹ãé è½ãã¦ããããããã§æ¤ç´¢ã¢ã«ã´ãªãºã ããã¼ã¿ç®¡çã¢ã«ã´ãªãºã ã«ã¤ãã¦èããå¿ è¦ããªããã¹ãã¬ã¼ã¸ããã¤ã¹ããåãªã巨大ãªé£æ³é åã¨ãã¦ãOSã«ä½è¨ãªè² è·ããããã«ãç´æ¥æ±ããã¨ãã§ããã
C++ã®ã©ã¤ãã©ãªã¯ãã¡ãããJavaã¨Rubyã¨Pythonããã使ããããã«ãã¦ãããPythonã ã¨ãããªæãã«ãªãã
dbm = tkrzw.DBM() dbm.Open("sample.tkh", True, file="PositionalParallelFile", align_pow=8, cache_buckets=True, block_size=512, access_options="direct,padding").OrDie() dbm.Set("japan", "tokyo").OrDie() dbm.Set("china", "beijing").OrDie() dbm.Set("korea", "seoul").OrDie() print(dbm.GetStr("japan")) dbm.Close().OrDie()
Javaã¨Rubyã¨Pythonãããã¤ã¬ã¯ãI/Oãæ±ããã©ã¤ãã©ãªã¯ãããªã«å¤ããªãã¨æãã®ã§ããããã®è¨èªã§å·¨å¤§ãã¼ã¿ãæ±ãããå ´åã«ã¯ããããå½¹ç«ã¤ã ãããä¸å±¤ã®ã¹ãã¬ã¼ã¸ãSSDãªã©ã®é«éããã¤ã¹ã§ããã°ãã¡ãã£ã¨é ãè¶ å·¨å¤§é£æ³é åã¨ãã£ãä½ç½®ã¥ãã§å©ç¨ã§ããã
æ§è½è©ä¾¡ããããæ©æã¨ãã¦ãç§ã®ãã¼ãPCã§ããDell XPS13ã使ããOSã¯Ubuntu 20.04ã®LinuxãCPUã¯Intel Core-i7 8550Uã§ãã¡ã¢ãªã¯16GBè¼ãã¦ãããã¹ãã¬ã¼ã¸ã¯SSDã ããããããé«æ§è½ãªãã®ã§ã¯ãªãã
以ä¸ã®æ¤è¨¼é ç®ãèãããåæ¹ã¨ãã8GBãããã®ãã¼ã¿ãã¼ã¹ãã¡ã¤ã«ãä½ããããããããããã¡ã¤ã«ã«å¯¾ããèªã¿è¾¼ã¿ã¯ã©ã³ãã ã¢ã¯ã»ã¹ã«ãªããæ¸ãè¾¼ã¿ã¯ã»ã¼ã·ã¼ã±ã³ã·ã£ã«ã«ãªãã¯ãã ã
- "Hash" : HashDBMã§ãå¤ã8000ãã¤ãã®ãã¼ã¿ã100ä¸åãSetãGetãRemoveããã
- "Tree" : TreeDBMã§ãå¤ã80ãã¤ãã®ãã¼ã¿ã1ååãSetãGetãRemoveããã
Hashã®åä½ã®å 訳ãèããã¨ãã¬ã³ã¼ãæ¬ä½ã®èªã¿è¾¼ã¿ã«å¹³å1åã¡ãã£ã¨ã®ãã¡ã¤ã«ã¢ã¯ã»ã¹ãå¿ è¦ã¨ãªããããã·ã¥ãã¼ãã«ã®ã¢ã¯ã»ã¹ã¯å®å ¨ã«ãã£ãã·ã¥ãããã®ã§ãã¡ã¤ã«ã¢ã¯ã»ã¹ã¯çºçããªãã®ã§ãã¬ã³ã¼ãæ¬ä½ã®èªã¿åºãã®ã¿ããã¡ã¤ã«ããè¡ããããã·ã¥ã®è¡çªãããã®ã§1ããå¢ãããTreeã®åä½ã¯ãããè¤éã ãè¤æ°ã®ã¬ã³ã¼ããB+æ¨ã®ãã¼ã¸ã«ã¾ã¨ãããã¦èªã¿æ¸ããããåè¨200ä¸ãã¼ã¸ãããèªã¿æ¸ãã¨ãªãããã®åã ã§å¹³å1åã¡ãã£ã¨ã®ãã¡ã¤ã«ã¢ã¯ã»ã¹ãçºçãããTreeã®æ¹ãã¹ã«ã¼ããããé«ãã®ã¯ã¬ã³ã¼ãæ°ã¨ã¬ã³ã¼ããµã¤ãºãéããã¨ã«ããã
ããããã®æ¤è¨¼é ç®ã«å¯¾ãã以ä¸ã®ãã¡ã¤ã«å®è£ ã§æ§è½ã測å®ããã
- "mmap" : mmapã«ãããã¡ã¤ã«å®è£
- "normal" : pread/pwriteã«ãããã¡ã¤ã«å®è£ ã§ãé常I/O
- "direct" : pread/pwriteã«ãããã¡ã¤ã«å®è£ ã§ããã¤ã¬ã¯ãI/O
çµæã¯ä»¥ä¸ã®ããã«ãªã£ããåä½ã¯QPSï¼ã¯ã¨ãªæ¯ç§ï¼ã
mmap Set | mmap Get | mmap Remove | normal Set | normal Get | normal Remove | direct Set | direct Get | direct Remove | |
Hash | 120435 | 464640 | 103931 | 124111 | 291351 | 124409 | 8225 | 3927 | 1973 |
Tree | 1171394 | 1335418 | 1142689 | 1196678 | 1227268 | 1114940 | 309542 | 147918 | 55438 |
äºæ³éãããã¤ã¬ã¯ãI/Oã¯é ãããããããããããã¤ã¹ãã®ãã®ã®æ§è½ãªã®ã ããã®æ¤è¨¼ã¯ãã¼ãã¦ã§ã¢ã®ãããã¯I/Oã®ã¹ã«ã¼ãããã測ã£ã¦ããã®ã¨ã»å義ã ãæå¤ãªã®ããHashã®ãã¤ã¬ã¯ãI/Oã§ãSetããGetãé ããããããããã«Removeãé ãã£ãã¨ãããã¨ã ãæ®éã«èããã¨ãæ¸ãè¾¼ã¿ããèªã¿è¾¼ã¿ã®æ¹ãæ©ãããªãã®ã ããå¿ ãããããã§ããªãããããç¾æ©è²ã£ã¦æ¸ãè¾¼ã¿ã®æ¹ãæ©ãã¨ãã¦ãããããªããªãRemoveãé ãã®ãã®èª¬æãã¤ããªããããã¯ã°ã©ã¦ã³ãã§ä½ããããããã§å¾ã®æ¹ã®æä½ã®æ¹ãé ããªã£ããããã®ãããããªãããå ¨ãæ¤è¨éããªãã¨ãè¨ã£ã¦ãããããããªãããã¤ã¬ã¯ãI/Oã®æ§è½ç¹æ§ããã¥ã¼ãã³ã°ã«ã¤ãã¦ã¯å ¨ãç¥è¦ããªãã¨ããã®ãæ£ç´ãªã¨ããã ã追ã£ã¦ãå®éã®ã¦ã¼ã¹ã±ã¼ã¹ãæ³å®ããæ§è½è©ä¾¡ããããã¨ããã ã
mmapã«ãããã¡ã¤ã«å®è£ ã使ãã¨ãå½ç¶ãããã»ã¹ã®ä½¿ç¨ã¡ã¢ãªã¯ãã¡ã¤ã«ãµã¤ãºã¨åçã®8GB以ä¸ã«ãªããpread/pwriteã«ããé常ã®ãã¡ã¤ã«I/Oã§ã¯ãããã»ã¹ã®ä½¿ç¨ã¡ã¢ãªã¯å¢ããªããããã¡ã¤ã«ã·ã¹ãã ã®ã¡ã¢ãªä½¿ç¨ç¶æ³ãæªåããããããããã¡ã¤ã«ã·ã¹ãã ã¯ã»ã¼å ¨ã¦ã®ä½å°ã¡ã¢ãªã使ãã®ã§ãã¡ã¢ãªä½¿ç¨éã¨ãã¦ã¯ä½æãã¥ããããããã8GBç¸å½ã®æ¢åã®ãã¼ã¸ãæ¨ã¦ããã¦ããã¯ãã§ãããã¯ã·ã¹ãã å ¨ä½ã®æ§è½ãä½ä¸ããããpread/pwriteã«ãããã¤ã¬ã¯ãI/Oã§ã¯ããããã£ã大éãã¼ã¸ç²æ¸ ãèµ·ãããªãã
ã¨ããããä»è¨ããã®ã¯ãæ°åQPSã許容ã§ããã¹ã«ã¼ããããªã®ã§ããã°ããã¼ãPCã®è²§å¼±SSDä¸ã®ãã¤ã¬ã¯ãI/Oã§ããããã使ãç©ã«ãªãã¨ãããã¨ã ãããã§ãã¦ãã¡ã¤ã«ã·ã¹ãã ã«ãããè² è·ã¯å°ãªãã®ã§ãã§ãããã¼ã¿ãæ±ãéã«ã¯ä¾¿å©ã ã¨æãã
Mac OSã¨ãããDarwinã§ããã¤ã¬ã¯ãI/Oã¯ãµãã¼ãããã¦ããããããfcntlã«F_NOCACHEã渡ãã¨ã§ããã¨ãã§ããªãã¨ããã話ã ãæ°ãåããããã¡ããæ¤è¨¼ããã
ã¾ã¨ãããã¼ã¿ãã¼ã¹ã©ã¤ãã©ãªTkrzwã«ãã¤ã¬ã¯ãI/Oæ©è½ãã¤ãããDBMã®ã·ã³ãã«ãªã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã¹ãã¬ã¼ã¸ããã¤ã¹ã®èªã¿æ¸ããç´æ¥çã«è¡ããã¨ãã§ãããã¡ã¢ãªæ¶è²»ãæãã¤ã¤æ¯è¼ç大ãããµã¤ãºã®ã¬ã³ã¼ãã大éã«æ±ãããã¨ããå ´åã«ã¯å½¹ç«ã¤ã ããã