ãhset mySey foo barããå®è¡ããåŸãå°ãªããšã296ãã€ãã®RAMã䜿çšããçç±ãInstagramã®ãšã³ãžãã¢ãæååããŒã䜿çšããªãçç±ã
hash-max-ziplist-entries /
hash-max-ziplist-valãåžžã«å€æŽããçç±ã
ããã·ã¥ã®åºç€ãšãªãããŒã¿åããªã¹ãããœãŒãæžã¿ã»ãããã»ããã®äžéšã§ããçç±-èªã¿åããªãã§ãã ããã æ®ãã«ã€ããŠã¯ãç§ã¯ããã«ã€ããŠè©±ãããããšããŸãã ã¡ã¢ãªã®ç¯çŽãéèŠãªã·ã¹ãã ãäœæããå ŽåãRedisã®ããã·ã¥ããŒãã«ã®èšèšãšæäœãç解ããããšã¯éåžžã«éèŠã§ãã
ãã®èšäºã®å
容ãããŒèªäœãä¿åããããã«Redisãè² æ
ããè²»çšã
ziplistãš
dictãäœã§ãããããã€ãäœã«äœ¿çšãããããã©ãã ãã®ã¡ã¢ãªãå æãããã
ããã·ã¥ã
ziplistã«æ ŒçŽãããŠããå Žåã
dicthã«ããå Žåãããã³ãããæäŸãããã®ã Redisã®æé©åã«é¢ãããã¡ãã·ã§ã³èšäºã®ãã³ããçå£ã«åãæ¢ããŠã¯ãªããªãã®ã¯ãªãã§ããã
ãã®è³æã2ã€ã®èšäºã«åå²ããããšãããã«è¬ããããšæããŸãã èŸæžã®äžéšãçµãããšãziplistã«ã€ããŠã®2çªç®ã®éšåãæåã®éšåãããããå°ãªãããšãããããŸããã ãã®çµæãååã§ãã¹ãããåŸãç§ã¯ããã2ã€ã®éšåã«åããããšã«ããŸããã
ãŸãã
ããã·ã¥ã®åºç€ãšãªãåã
ã®æ§é ãã©ã®ããã«æ©èœããããç解ããå¿
èŠããããŸãã 次ã«ãããŒã¿ãä¿åããã³ã¹ããèšç®ããŸãã redisObjectãäœã§ãããRedis
ãæååãã©ã®ããã«
æ ŒçŽããããæ¢ã«ç¥ã£ãŠãããšããããªã¢ã«ãç解ãããããªã
ãŸã ã
ããã·ã¥æ§é ãããã·ã¥ããŒãã«ãšããŠèªèããããšããæ··ä¹±ããããŸãã å
éšã§ã¯ãå®éã®ããã·ã¥ããŒãã«ã§ããå¥ã®çš®é¡ã®èŸæžããããŸãã æ§é èªäœã¯ãdictãšziplistã®ãã€ããªãããããã·ã¥ããŸãã ããã·ã¥ããŒãã«ãã©ã®ããã«é
眮ãããæ©èœãããã«ã€ããŠã®åªãã玹ä»ãå¿
èŠã§ãã ãã®è³æã®ãªãèšäºãååã®äœäººãã«èŠãããšããããããªãã§ã¯ãã¹ãŠãæ··ä¹±ãæããšç¢ºä¿¡ããŸããã
Redisã§ã¯ãç¹å®ã®ããã·ã¥ããŒãè¡šãå
éšããŒã¿åãå¶åŸ¡ããŸãã å€æ°
hash-max-ziplist-entriesã¯ã
REDIS_ENCODING_ZIPLISTãšã³ã³ãŒãã£ã³ã°ã䜿çšã§ããããã·ã¥å
ã®èŠçŽ ã®æ倧æ°ã決å®ã
ãŸã ã ããšãã°ãhash-max-ziplist-entries = 100ã®å Žåã100åæªæºã®èŠçŽ ãããéããããã·ã¥ã¯ziplistãšããŠè¡šç€ºãããŸãã ããã«èŠçŽ ãååšãããšããã«ã
REDIS_ENCODING_HT ïŒdictïŒã«å€æãããŸãã
Hash-max-ziplist-valã¯åæ§ã«æ©èœããŸã-ããã·ã¥å
ã®åäžãã£ãŒã«ãã®å€ã®é·ãã
hash-max-ziplist-valãè¶
ããªãéããziplistã䜿çšãããŸãã ãã©ã¡ãŒã¿ã¯ãã¢ã§æ©èœããŸã-ziplistããdictãžã®å
éšè¡šçŸã¯ããããã®ãããããè¶
ãããšããã«çºçããŸãã ããã©ã«ãã§ã¯ãããã·ã¥ã¯åžžã«ziplistãšã³ã³ãŒããæã¡ãŸãã
èŸæžã¯Redisã®éèŠãªæ§é ã§ãã ããã·ã¥ã ãã§ãªãããªã¹ããzsetãsetã«å¯ŸããŠãã ããã¯ãRedisãããããçš®é¡ã®ããŒãšå€ã®ããŒã¿ãã³ãã«ãæ ŒçŽããããã«äœ¿çšããäž»èŠãªæ§é ã§ãã Redisã®èŸæžã¯ãã©ã³ãã ãªã¢ã€ãã ã®æ¿å
¥ã眮æãåé€ãæ€çŽ¢ãååŸããµããŒãããå€å
žçãªããã·ã¥ããŒãã«ã§ãã èŸæžã®å®è£
å
šäœã¯ãRedisãœãŒã¹ã®dict.hããã³disc.cã«ãããŸãã
ããŒãã«ã®ããã·ã¥ã«ã¯ãããã©ãŒãã³ã¹ãç解ããé©åãªå®è£
ãéžæããããã«éèŠãªãã©ã¡ãŒã¿ãŒãããã€ããããŸãã ããŒã¿æ§é ã«ãšã£ãŠéèŠãª
ã¢ã«ãŽãªãºã ã®è€éãã«å ããŠ
ãããã¯äœ¿çšæ¡ä»¶ã«çŽæ¥äŸåããå€ãã®èŠå ã§ããããŸãã ãã®ç¹ã§ã
ãã£ã«ãã¡ã¯ã¿ãŒãš
ãµã€ãºå€æŽæŠç¥ã¯ç¹ã«èå³æ·±ããã®ã§ãã åŸè
ã¯ããªã¢ã«ã¿ã€ã ã§åäœããã·ã¹ãã ã§ã¯ç¹ã«éèŠã§ããããã¯ãå©çšå¯èœãªçè«çãªå®è£
ã®ãããããåžžã«å€ãã®RAMãŸãã¯ããã»ããµæéãè²»ããéžæã®åã«çœ®ãããããã§ãã Redisã¯ããããã
å¢åãµã€ãºå€æŽã䜿çšã
ãŸã ã ç·åœ¢ããã·ã¥ãå調ããŒãäžè²«æ§ã®ããããã·ã¥ãããã·ã¥ã®è©³çŽ°ã«å¿ããŠã³ããŒããããšã«ãããµã€ãºå€æŽãè©Šãææ¡ããããŸããã
å¢åãµã€ãºå€æŽã®å®è£
ïŒé¢æ°
dictRehashMilliseconds ã
dict.cã® dictRehashïŒã¯æ¬¡ã®ããã«åæžãããŸãã
- ããŒãã«ã®ãµã€ãºãå€æŽããå Žåãæ¢åã®ããŒãã«ããæããã«å€§ããæ°ããããã·ã¥ããŒãã«ãéžæããŸãïŒå€ãããŒãã«ã¯å€æŽããŸããïŒã è¡ãšåæ§ã«ãRedisã¯æ°ããããŒãã«ã®ã¹ãããæ°ã2åã«ããŸãã ããã«å ããŠãèŠæ±ããããµã€ãºïŒå
ã®ãµã€ãºãå«ãïŒã¯ãåžžã«æãè¿ã2ã®çŽ¯ä¹ã«èª¿æŽãããŸãã ããšãã°ã9ã€ã®ã¹ããããå¿
èŠã§ã16ãå²ãåœãŠãããŸããæ°ããããŒãã«ã®æå°å¢çã¯ãã³ã³ãã€ã«ã¹ããŒãžDICT_HT_INITIAL_SIZEã®å®æ°ã«ãã£ãŠæ±ºå®ãããŸãïŒããã©ã«ãã§ã¯4ãdict.hã§å®çŸ©ïŒã
- åèªã¿åã/æžã蟌ã¿æäœäžã«ãäž¡æ¹ã®ããŒãã«ã調ã¹ãŸãã
- ãã¹ãŠã®æ¿å
¥æäœã¯ãæ°ããããŒãã«ã§ã®ã¿å®è¡ãããŸãã
- ã©ã®æäœã§ãã nåã®èŠçŽ ãå€ãããŒãã«ããæ°ããããŒãã«ã«ç§»åããŸãã
- ãã¹ãŠã®èŠçŽ ã移è¡ãããå Žåãå€ãããŒãã«ãåé€ããŸãã
Redisã®å Žåã
nã¯ãµãŒããŒãã¹ããã1000ãã1ããªç§ã§è»¢éããããã«ç®¡çããããŒã®æ°ã§ããã€ãŸããåããã·ã¥ã®1ã¹ãããã¯å°ãªããšã1000èŠçŽ ã§ãã é·ãæååå€ãæã€ããŒã䜿çšããå Žåããã®ãããªæäœã¯1ããªç§ã倧å¹
ã«è¶
ãããµãŒããŒãããªãŒãºããå¯èœæ§ããããããããã¯éèŠã§ãã è¿œå ã®åŽé¢ã¯ãããŒãã«ã®åããã·ã¥äžã®å€§ããªã¡ã¢ãªæ¶è²»ã®ããŒã¯ã§ããããã¯ãå€æ°ã®ãé·ããããŒãæã€ããã·ã¥ã§æ¥æ¿ã«çŸããŸãã èšç®ã§ã¯ãããã·ã¥å€ã®ããŒãã«ãèæ
®ããŸãããRedisããŒãã«å€§ããªããŒãã«ãããå Žåããµã€ãºãå€æŽã§ããªãå Žåã¯ãµãŒãã¹ãæåŠããå¯èœæ§ãé«ãããšãæãåºããŠãã ããã ããšãã°ã
herokuã§äºç®ã®Redisãã¬ã³ã¿ã«ããå ŽåïŒ25 MBã®ã¡ã¢ãªã®ã¿ïŒã
ãã£ã«ãã¡ã¯ã¿ãŒ ïŒ
dict_force_resize_ratioå®æ°ã¯ããã©ã«ãã§5ã«çããïŒã¯ããã£ã¯ã·ã§ããªã®
ã¹ããŒã¹ã®åºŠåããšãRedisãçŸåšã®ãã£ã¯ã·ã§ããªã®ãµã€ãºã2åã«ããããã»ã¹ãéå§ããã¿ã€ãã³ã°ã決å®ããŸãã ãã£ã«ãã¡ã¯ã¿ãŒã®çŸåšã®å€ã¯ãããã·ã¥ããŒãã«å
ã®èŠçŽ ã®ç·æ°ãšã¹ãããæ°ã®æ¯çãšããŠå®çŸ©ãããŸãã ã€ãŸãã4ã€ã®ã¹ããããš24ã®èŠçŽ ïŒãããã®éã«åæ£ããŠããïŒãããªãå ŽåãRedisã¯ãµã€ãºã2åã«ããããšã決å®ããŸãïŒ24/4> 5ïŒã èŸæžããŒã«ã¢ã¯ã»ã¹ãããã³ã«ãåæ§ã®ãã§ãã¯ãè¡ãããŸãã èŠçŽ ã®æ°ãã¹ãããã®æ°ä»¥äžã«ãªããšãRedisã¯ã¹ãããã®æ°ã2åã«ããŸãã

ãœãŒã¹ã§ãã®æ§é ãèŠãŠãã ããtypedef struct dict { dictType *type; void *privdata; dictht ht[2]; long rehashidx; int iterators; } dict; typedef struct dictht { dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used; } dictht; typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; double d; } v; struct dictEntry *next; } dictEntry;
åèŸæžã¯ã
dict ã
dictht ã
dictEntryã®3ã€ã®æ§é ã®äœ¿çšãäžå¿ã«æ§ç¯ãããŠããŸãã Dictã¯ã«ãŒãæ§é ã§ããããã®
htãã£ãŒã«ãã«ã¯ãã¹ãããã®ãªã¹ããå«ãdicthtããŒãã«ã1ãã2ïŒè§£æ±ºæïŒã«æ ŒçŽãããŸãã 次ã«ã
dicthtã¯dictEntryããã®ãªã³ã¯ãªã¹ãã
ä¿åããŸãã å
dictEntryã¯ãããŒãšå€ãžã®ãã€ã³ã¿ãŒïŒãã€ã³ã¿ãŒãŸãã¯double / uint64_t / int64_tã®åœ¢åŒïŒãæ ŒçŽããŸãã å€ãšããŠæ°å€ã䜿çšããå Žå
-dictEntryã¯æ°å€ãæ ŒçŽããæååãæ ŒçŽããŸã-ããŒãäžã®sdsæååãæã€redisObjectãžã®ãã€ã³ã¿ãŒãä¿åãããŸãã
RedisãããŒãã«ããã·ã¥å
ã®ç¹å®ã®ããŒã«ã¢ã¯ã»ã¹ããå ŽåïŒ
- ããã·ã¥é¢æ°ã䜿çšãããšãç®çã®ã¹ããããèŠã€ãããŸãïŒçŸåšãMurMur2ããã·ã¥é¢æ°ã¯ã¹ãããã®æ€çŽ¢ã«äœ¿çšãããŠããŸãïŒã
- ãã¹ãŠã®ã¹ãããå€ã¯ãããŒãæ¯èŒããŠ1ã€ãã€ãœãŒããããŸãïŒãªã³ã¯ãªã¹ãïŒã
- dictEntryã§èŠæ±ãããæäœãå®è¡ãããŸãïŒããŒãšå€ã䜿çšïŒ
HSETãŸãã¯
HGETã®ãã«ãã¯ããããã
OïŒ1ïŒã§å®è¡ãããæäœã§ãããšè¿°ã¹ãŠããŸãã 泚æããŠãã ããïŒã»ãšãã©ã®å Žåãhsetã¯
OïŒnïŒãåããŸãã ã¢ã¯ãã£ããªã¬ã³ãŒããæã€å€§ããªããŒãã«ïŒ1000ãè¶
ããèŠçŽ ïŒã§ã¯ãhgetã¯
OïŒnïŒãå æããŸãã
å®éã«äœ¿çšãããã¡ã¢ãªéã®è³ªåã«å¯Ÿããçãã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã³ã³ãã€ã©ãããã»ã¹ã®ã¿ã€ãã䜿çšãããã¢ãã±ãŒã¿ïŒredisã§ã¯ãããã©ã«ãã§ã¯jemallocïŒã«ãã£ãŠç°ãªããŸãã centos 7ãå®è¡ããŠãã64ããããµãŒããŒã§ã¢ã»ã³ãã«ãããredis 3.0.5ã®ãã¹ãŠã®èšç®ãè¡ããŸãã
ããã§ã `hset mySet foo bar`ãåŒã³åºããšãã«ç¡é§ã«ãªãã¡ã¢ãªã®éãèšç®ã§ããŸãã 空ã®èŸæžãäœæããéã®ãªãŒããŒãããïŒ
- dictEntry ïŒ3 * size_ofïŒãã€ã³ã¿ãŒïŒ
- dictht ïŒ3 * size_ofïŒç¬Šå·ãªãlongïŒ+ size_ofïŒãã€ã³ã¿ãŒïŒ= 24 + size_ofïŒãã€ã³ã¿ãŒïŒ
- dict ïŒ2 * size_ofïŒdicthtïŒ+ 2 * size_ofïŒintïŒ+ 2 * size_ofïŒãã€ã³ã¿ãŒïŒ= 56 + 4 * size_ofïŒãã€ã³ã¿ãŒïŒ
ãã¹ãŠããŸãšãããšãnåã®èŠçŽ ãæ ŒçŽããããã®æŠç®ãªãŒããŒããããèšç®ããåŒãåŸãããŸãã
56 + 2 * size_of(pointer) + 3 * next_power(n) * size_of(pointer) ------------------------- ------------------------------------- | | ` dict + dictht `dictEntry
ãã®åŒã§ã¯ãããŒèªäœãšå€ãä¿åããã³ã¹ãã¯èæ
®ãããŠããŸããã ããŒã¯åžžã«redisObjectã®sdsæååã§ãã å€ã¯ãã¿ã€ãã«å¿ããŠãsdsæååãŸãã¯ãã€ãã£ãã®æ°å€ïŒæŽæ°ãŸãã¯æµ®åå°æ°ç¹ïŒã«ããããšãã§ããŸãã æ°ããèŸæžã®æå°ã¹ãããæ°ïŒdictEntryïŒã
DICT_HT_INITIAL_SIZEïŒ4ïŒã§ããããšãæãåºããŠã `hset mySet foo bar`ããã§ãã¯ããŸãããã
56 + 2 * 8 + 3 * 4 * 8 = 168 + 2 * 56 = 280ãã€ãïŒ296ãã€ãã«æããããŸãïŒã
ç§ãã¡ã¯ãã§ãã¯ããŸãïŒ
config set hash-max-ziplist-entries 0 +OK config set hash-max-ziplist-value 1 +OK hset mySet foo bar :1 debug object mySet +Value at:0x7f44894d6340 refcount:1 encoding:hashtable serializedlength:9 lru:5614464 lru_seconds_idle:6
æ
å ±ã¡ã¢ãªã«ã¯äœã衚瀺ãããŸããïŒ 320ãã€ããæ¶è²»ãããããšã瀺ããŸãã äºæ³ãã24ãã€ãå€ããªããŸããã ãã®ã¡ã¢ãªã¯ãã¡ã¢ãªãå²ãåœãŠãã¢ã©ã€ã¡ã³ãã³ã¹ãã§ãã
mySetããŒã¯ã©ã®ããã«
ä¿åãã ãRedisã¯ãã®ååã§ããã·ã¥ãã©ã®ããã«èŠã€ããã®ã§ããïŒ Redisã®äžå¿ã«ã¯
redisDbæ§é ïŒredis.hã®redisããŒã¿ããŒã¹è¡šçŸïŒããããŸãã ãã¹ãŠã®ããŒã®åäžã®èŸæžèŸæžãå«ãŸããŠããŸãã äžèšãšãŸã£ããåãã§ãã ããã¯éèŠã§ãããªããªããããŒããŒã¿ããŒã¹ãä¿åããã³ã¹ãã®æŠå¿µãæäŸããå€ãã®åçŽãªããŒã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã«ä¿åãã䟡å€ããªããšãããã³ããç解ããããã®åºç€ãæäŸããããã§ãã
èšäº
ãäœåãã®åçŽãªããŒãä¿åããŠããããšãèŠãŠã¿ãŸãããã æååããŒã䜿çšããªãå€ãã®ããŒãšå€ã®ãã¢ãä¿åããå¿
èŠãããå Žåã¯ãããŒãã«ã®ããã·ã¥ã䜿çšããŸãã
instagramã®èšäºã®
ãã¹ãã®èŠç¹ã§ãã Redisã®å®è¡ä»¥å€ã®ãã§ãã¯ãè¡ããªãããã«ãLUAã«æžã蟌ã¿ãŸãã
flushall +OK info memory $225
1,000,000åã®æŽæ°ããŒãæ ŒçŽããã«ã¯
ã88 mbãå°ãè¶
ãã容éãå¿
èŠã§ããã 次ã«ãåãããŒã¿ãããã·ã¥ããŒãã«ã«ä¿åãã2000åã®ããã·ã¥ããŒãã«éã§ããŒãåçã«åæ£ããŸãã
flushall +OK info memory $227
åãããŒã¿ãæŽæ°ãã£ãŒã«ãã«æ ŒçŽããããã«
ã103 mbãå°ãè¶
ããæéãè²»ãããŸããã ãã ããããšãã°10,000,000åã®ããŒãä¿åããããšãããšãç¶æ³ã¯åçã«å€åããŸããã€ãŸãã
ã970 mb察
ã165 mbã§ã ïŒãããã¯ãã¹ãŠãããŒããŒãã«ã®ã·ã¹ãã ããã·ã¥ã®ã¹ãã¬ãŒãžãªãŒããŒãããã«ãããŸãïŒã äžè¬ã«ããæ°åã®ããŒãããå Žåã¯ãæååããŒã䜿çšããªãããšããã«ãŒã«ãåœãŠã¯ãŸããŸãã
å¥ã®åŽé¢ãèŠãŠã¿ãŸãããã ãã®çš®ã®æé©åã説æããå Žåã
ãšã³ãã£ãã£ïŒèå¥å ïŒããšãã°ã `set usernameïŒ4566 RedisMan`ïŒãšãã圢åŒã®ããŒãå€æ°ãããããã·ã¥ããŒãã«ãžã®åãæ¿ããææ¡ããããšããããããŸãã
ãã±ããïŒIDèå¥åã®å€ ïŒäŸïŒ `hsetãŠãŒã¶ãŒåïŒ300 4566 RedisMan`ïŒã æŠå¿µã®éšåçãªçœ®æãããããšãç解ããããšãéèŠã§ã-sdsæåå `usernameïŒ4566`ã¯ãããŒãã£ãŒã«ã4566ãšã³ã³ãŒãããã
REDIS_ENCODING_INTã«å€ãããŸãã ããã¯ãredisObjectã®sdsæååã®ä»£ããã«æ°åã䜿çšãå§ãããããïŒjemallocã調æŽããåŸã®ïŒsdsæååããšã«æå°32ãã€ãã4ãã€ãã«ãªã£ãããšãæå³ããŸãã
ziplistã®ããŒãã«ã®ããã·ã¥ãšã³ã³ãŒãã£ã³ã°ã匷å¶ããŸãããïŒ
config set hash-max-ziplist-entries 1000 +OK config set hash-max-ziplist-value 1000000 +OK flushall +OK eval "for i=0,1000000,1 do local b=math.floor(i/500); redis.call('hset', 'usernames:' ..b, i, i) end" 0 $-1 info memory $228
ç§ãã¡ã®ããŒã¿ã¹ãã¬ãŒãžã¯ã1,000,000åã®ããŒã®äŸã§ã¯16 MBãŸãã¯72 MBã®ç¯çŽïŒ
5åå°ãªã ïŒã§æžã¿ãŸããã é
åçã§ããïŒ èšäºã®ç¬¬2éšã®èª¬æã«ç§»ããŸãã
äžéã®çµè«ã§ã¯ãã¡ã¢ãªãç¯çŽããããŒããããã·ã¹ãã ã«ã€ããŠããã€ãã®éèŠãªçµè«ãå®åŒåãã䟡å€ããããŸãã
- å¯èœãªéãããã·ã¥ããŒãã«ã®ããŒãå€ããã£ãŒã«ãã®æ°å€åã䜿çšããŸãã ãã¬ãã£ãã¯ã¹/ãã¹ããã£ãã¯ã¹ã䜿çšããªãã§ãã ããã
- Redisãç©æ¥µçã«äœ¿çšããã·ã¹ãã ãèšèšãããšãã¯ã1ã€ã®ããŒã¿èŠä»¶-1ã€ã®Redisãšããååããé²ãã§ãã ããã hash-max-ziplist-entries / hash-max-ziplist-valueã®èšå®ãšãã¬ãã£ãã¯ã¹ãªãã®ããŒã®åºå¥ã«ãããç°çš®ããŒã¿ãä¿åããããšã¯å°é£ã§ãã
- åçŽãªããŒãããã·ã¥ããŒãã«ã°ã«ãŒãã§çœ®ãæããå Žåã100äžä»¥äžã®ããŒã®æ°ã§æé©åãæ©èœããããšãå¿ããªãã§ãã ããã
- ã³ããŒã«æ°çŸäžããã³æ°åã®ããŒãããå Žåãããããã·ã¹ãã ãã£ã¯ã·ã§ããªã«ä¿åããããã«è«å€§ãªè²»çšãããããã·ã¹ãã ãã£ã¯ã·ã§ããªã®äºçŽã«å¯Ÿããã¡ã¢ãªãªãŒããŒã©ã³ãçºçããŸãã ããšãã°ã1ååã®ããŒã®å ŽåãããŒã¿ãèæ
®ããã«ãã·ã¹ãã ãã£ã¯ã·ã§ãã³ã°ã®ã¿ã§çŽ2.5 GBã«ãªããŸãã
- hash-max-ziplist-entries / hash-max-ziplist-valueã®å€ã®äžã«ç§»åããããŒã¿ãdictã®ä»£ããã«ziplistã«ä¿åãããŠããå Žåãæ°çŸããŒã»ã³ãã§è¡šãããã¡ã¢ãªç¯çŽãåŸãããšãã§ããŸãã ãããŠãé«ãCPU䜿çšçã§ãããæ¯æããŸãã ããã«ããã«ã€ããŠã
ç®æ¬¡ïŒ
èšäºã®å·çã«äœ¿çšãããè³æïŒ