Google App Engineã®ãƒ©ãƒ³ã‚ングå•é¡Œ
Google App Engineã§ä½•ã‹ã¨è©±é¡Œã«ãªã£ã¦ãŸãƒ©ãƒ³ã‚ングå•é¡Œã€‚
appengine ja night #8(ajn8)ã«å‚åŠ ã•ã‚ŒãŸæ–¹ãªã‚‰ã”å˜çŸ¥ã®ã‚ˆã†ã«ã€æ—¢ã«id:koherentã•ã‚“ãŒSkiplistã¨ã„ã†ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ を使ã£ã¦è§£æ±ºã—ã¦ã„ã¾ã™ã€‚
å‚考:http://d.hatena.ne.jp/koherent/20100425/1272176872
ãã®ã»ã‹ã«ã‚‚ã€id:bufferingsã•ã‚“ã®å®Ÿè£…例もã‚ã‚Šã¾ã™ã€‚
å‚考:http://d.hatena.ne.jp/bufferings/20100225/1267121912
id:bufferingsã•ã‚“ã®ã¨ã»ã¼åŒã˜ã‚¢ã‚¤ãƒ‡ã‚¢ã‚’自分ã§ã‚‚æ€ã„ã¤ã„ã¦ãŸã‚“ã§ã€ã¡ã‚‡ã£ã¨slim3使ã£ã¦å®Ÿè£…ã—ã¦ã¿ã¾ã—ãŸã€‚
http://tetz-lab.appspot.com/ranking/
事å‰ã«ä¹±æ•°ã§10万件ã®ç‚¹æ•°ãƒ‡ãƒ¼ã‚¿ã‚’入れã¦ã‚ã‚Šã¾ã™ã€‚
ã£ã¦ã€ä½•ã‚’今更ãªæ„Ÿã˜ãªã‚“ã§ã™ãŒã€ã›ã£ã‹ãæ€ã„ã¤ã„ã¦å®Ÿè£…ã¾ã§ã—ã¡ã‚ƒã£ãŸã®ã§ã€æ—¥è¨˜ã«æ®‹ã—ã¦ãŠãã¾ã™ã€‚
ãƒã‚¸ãƒƒã‚¯ã‚’ç°¡å˜ã«èª¬æ˜Žã—ã¾ã™ã€‚
ã¾ãšã€
- 点数ã”ã¨ã«ãã®ç‚¹æ•°ã‚’å–ã£ãŸäººæ•°ã‚’æ ¼ç´ã™ã‚‹é ˜åŸŸã‚’用æ„ã™ã‚‹ã€‚
- ãã®é ˜åŸŸã‚’サイズ16ã®é…列ã«æ ¼ç´ã™ã‚‹ã€‚点数ã®ä¸‹ä½4ビットãŒé…列ã¸ã®indexã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã‚‹ã€‚
- ãã®ä¸Šä½4ビットをindexã¨ã—ã¦æŒã¤é…列ã«ã€ä¸Šè¨˜ã®é…åˆ—ã‚’æ ¼ç´ã™ã‚‹ã€‚ã“ã®é…列ã§ã¯æ ¼ç´ã•ã‚ŒãŸå…¨é…列ã®ä¿æŒã•ã‚ŒãŸäººæ•°ã®åˆè¨ˆå€¤ã‚’ä¿æŒã™ã‚‹ã€‚
- ã•ã‚‰ã«ä¸Šä½4ビット・・・(ç¹°ã‚Šè¿”ã—)
ã¨ã„ã†ãƒ‡ãƒ¼ã‚¿æ§‹é€ を作りã¾ã™ã€‚
69,533点(16進数ã§10F9D)を例ã«è€ƒãˆã‚‹ã¨ã€ä¸‹ã®å›³ã¿ãŸã„ãªæ„Ÿã˜ã®æ§‹é€ ã§ã™ã€‚
ランã‚ングを計算ã™ã‚‹ã¨ãã«ã¯ã€èµ¤ã„矢å°ã§ç¤ºã—ãŸã‚ˆã‚Šé«˜ã„点数ã®é ˜åŸŸã«æ ¼ç´ã•ã‚ŒãŸäººæ•°ã®åˆè¨ˆå€¤ã‚’計算ã—ã€æœ€å¾Œã«+1ã™ã‚Œã°OKã§ã™ã€‚
今回ã®å®Ÿè£…ã§ã¯ã€å…¨Layerã®é…列をã¾ã¨ã‚ã¦ä¸€ã¤ã®Entityã«ä¿å˜ã—ã¦ã„ã‚‹ã®ã§ã€getã¯ä¸€å›žã§æ¸ˆã¿ã¾ã™ã€‚
ã¡ãªã¿ã«ã€ã‚‚ã—é…列毎ã«Entityを分ã‘ã¦ã‚‚ã€ãƒ©ãƒ³ã‚ング計算・更新処ç†ã¨ã‚‚ã«ä¸€ç•ªä¸ŠLayerã«ã¯å¿…ãšã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã§ã€åˆ†æ•£ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。分散ã«é–¢ã—ã¦ã¯å¾Œè¿°ã€‚
ランã‚ング計算ã«ã‹ã‹ã‚‹æ™‚é–“ã¯åˆå›žã¯600〜1000ミリ秒程度ã€2回目以é™ã¯70〜120ミリ秒程度ã§ã—ãŸã€‚
2回目以é™ãŒæ—©ã„ã®ã¯ã€å¤šåˆ†Datastoreå´ã«ã‚ャッシュã•ã‚Œã‚‹ã‹ã‚‰ã‹ãªï¼Ÿ(spin upã¯è¨ˆç®—時間ã«å…¥ã‚Œã¦ãªã„ã‹ã‚‰ã€é–¢ä¿‚ãªã„ã¯ãšã€‚)
é »ç¹ã«ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚‹å ´åˆã«ã¯ã€70〜120ミリ秒ã§å‡¦ç†ã§ãã‚‹ã€ã¨ã„ã†ã“ã¨ã«ãªã‚Šãã†ã§ã™ã€‚
æ›´æ–°ã¯120〜200ミリ秒程度ã‹ã‹ã£ã¦ã„ã¾ã™ã€‚
ã“ã®æ–¹å¼ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã®é€Ÿåº¦ã¯ã€Skiplistã¨é•ã£ã¦ç‚¹æ•°ã®ä»¶æ•°ã«ã¯å½±éŸ¿ã‚’å—ã‘ãšã€ç‚¹æ•°ã®å–ã‚Šã†ã‚‹ç¯„囲ã«å½±éŸ¿ã‚’å—ã‘ã¾ã™ã€‚
点数ãŒå–ã‚Šã†ã‚‹å€¤ãŒ0〜Xã ã¨ã™ã‚‹ã¨ã€ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã®é€Ÿåº¦ã¯ã€
  O(log 16 (X))
ã«ãªã‚‹ã‚“ã˜ã‚ƒãªã„ã‹ã¨æ€ã„ã¾ã™(多分)。
Skiplistã¨æ¯”ã¹ã‚‹ã¨â€¦
ã“ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã¯Skiplistã¨æ¯”ã¹ã¦ã€æ±Žç”¨æ€§ãŒã‚ã‚Šã¾ã›ã‚“。
扱ã†ã®ãŒæ•´æ•°å€¤ã®ç‚¹æ•°ãªã‚‰å•é¡Œãªã„ã§ã™ãŒã€ä¾‹ãˆã°ã“ã‚ŒãŒå°æ•°å€¤ã ã¨é€”端ã«é›£ã—ããªã‚Šã¾ã™ã€‚
特ã«æ–‡å—列を扱ã†ã®ã¯å¤šåˆ†ç„¡ç†ã§ã—ょã†ã€‚
Skiplistãªã‚‰ä»»æ„ソートæ¡ä»¶ãŒæ‰±ãˆã‚‹ã‚“ã§ã™ãŒã€ã“ã¡ã‚‰ã¯ä½¿ç”¨ã§ãã‚‹æ¡ä»¶ãŒã‹ãªã‚Šé™å®šã•ã‚Œã¾ã™ã€‚
ã¾ã‚ã§ã‚‚ã€ãã®é™å®šã•ã‚ŒãŸæ¡ä»¶ãªã‚‰é«˜é€Ÿã«å‹•ä½œã—ã¾ã™ã—ã€é€Ÿåº¦ãŒãƒ‡ãƒ¼ã‚¿ä»¶æ•°ã«ä¾å˜ã—ãªã„ã£ã¦ç‰¹é•·ã‚‚ã‚ã‚‹ã‚“ã§ã€ä½¿ã„ã©ã“ã‚ã¯ãã‚Œãªã‚Šã«ã‚ã‚‹ã‚“ã˜ã‚ƒãªã„ã‹ã¨ã¯æ€ã„ã¾ã™ã€‚
ランã‚ング計算以外も実ç¾ã§ãる?
id:koherentã•ã‚“ãŒajn8å‘ã‘ã«ä½œæˆã•ã‚ŒãŸã‚¹ãƒ©ã‚¤ãƒ‰ã‚’見ãªãŒã‚‰ã€åŒã˜ã“ã¨ãŒã§ãã‚‹ã‹è€ƒãˆã¦ã¿ã¾ã—ãŸã€‚
http://www.slideshare.net/koher/skiplists20100604
- P.36 リストã®è¦ç´ 数・・・一番上ã®éšŽå±¤ã®ä¿æŒã™ã‚‹äººæ•°ã€‚O(1)ã§è¨ˆç®—å¯èƒ½ã€‚
- P.37 è¦ç´ 番å·ã«ã‚ˆã‚‹æ¤œç´¢ï½¥ï½¥ï½¥è¦ã™ã‚‹ã«ã€Œâ—‹ä½ã®äººã¯ä½•ç‚¹ã€ã€‚ランã‚ング計算åŒæ§˜ã€O(log 16 (X))ã§è¨ˆç®—å¯èƒ½ã€‚
- P.39 ç·å’Œãƒ»å¹³å‡ï½¥ï½¥ï½¥åŒæ§˜ã«ã€é…列ã¨ä¸€ç·’ã«æ ¼ç´ã•ã‚ŒãŸè¦ç´ ã®ç·å’Œã‚’ä¿æŒã™ã‚Œã°å¯èƒ½ã€‚一番上ã®Layerã‹ã‚‰å–å¾—ã™ã‚Œã°è‰¯ã„ã®ã§ã€O(1)ã§OK。
- P.40 範囲ã«å¯¾ã™ã‚‹é›†ç´„・・・åŒæ§˜ã«å®Ÿç¾å¯èƒ½ã€‚
- P.41 最大・最å°ãƒ»ä¸å¤®å€¤ï½¥ï½¥ï½¥è¦ç´ 数番目・0番目・è¦ç´ æ•°/2番目ã®æ¤œç´¢ã¨ã—ã¦å®Ÿç¾å¯èƒ½ã€‚全部O(log 16 (X))。
- P.42 ã‚ー値以外ã®é›†ç´„・・・ã“れもåŒæ§˜ã«é…列ã¨ä¸€ç·’ã«ä¿æŒã™ã‚Œã°å¯èƒ½ã€‚
- P.43 ã‚ー値以外ã®æœ€å¤§ãƒ»æœ€å°ï½¥ï½¥ï½¥ã“れもåŒæ§˜ã«ã‚„ã‚Œã°å¤šåˆ†å¯èƒ½ãã†ã§ã™ã。
ã¨ã„ã†è¨³ã§ã€é›†è¨ˆé–¢ä¿‚ã¯ã»ã¼åŒã˜äº‹ãŒå®Ÿç¾ã§ããã†ã§ã™ã€‚
ãã®ä»–ã€Pagingã¯ä¸€å¿œç„¡ç†ã™ã‚Œã°æ¡ä»¶ä»˜ãã§å®Ÿç¾ã§ããã†ãªã‚“ã§ã™ãŒï½¥ï½¥ï½¥ã“ã‚Œã«é–¢ã—ã¦ã¯ç„¡ç†ã‚„ã‚Šãªæ„Ÿã˜ãŒå¦ã‚ãªã„ã®ã§ã€å‰²æ„›ã—ã¾ã™ã€‚
分散ã¸ã®è€ƒå¯Ÿãã®ï¼‘−分散カウンタ方å¼
スケールã™ã‚‹ã‚«ã‚¦ãƒ³ã‚¿ã®å®Ÿè£…ã¨ã—ã¦ã€ã€Œåˆ†æ•£ã‚«ã‚¦ãƒ³ã‚¿ã€ã¨ã„ã†ã®ãŒçŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚
appengineã§ã¯æ›´æ–°å‡¦ç†ã«æ¯”ã¹ã¦getãŒã¨ã¦ã‚‚æ—©ã„ã®ã§ã€ã‚«ã‚¦ãƒ³ã‚¿ç”¨ã®Entityを複数個用æ„ã—ã¦ã€
 ・更新ã¯ãƒ©ãƒ³ãƒ€ãƒ ã«é¸ã‚“ã ã©ã‚Œã‹ä¸€ã¤ã«å¯¾ã—ã¦å®Ÿæ–½
 ・カウンタã®å€¤ã¯å…¨éƒ¨parallel getã—ã¦åˆè¨ˆå€¤ã‚’計算
ã¨ã™ã‚‹ã“ã¨ã§ã€é«˜é€Ÿã‹ã¤ã‚¹ã‚±ãƒ¼ãƒ«ã™ã‚‹ã‚«ã‚¦ãƒ³ã‚¿ãŒå®Ÿç¾ã§ãã‚‹ã€ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚
上ã«ã‚‚書ãã¾ã—ãŸãŒã€ã“ã®å®Ÿè£…ã§ã¯Entity1個ã§ã‚„ã£ã¦ã„ã‚‹ã®ã§ã€ã“ã®è€ƒãˆæ–¹ãŒã»ã¨ã‚“ã©ãã®ã¾ã¾ä½¿ãˆã¾ã™ã€‚
実際ã«å®Ÿè£…ã—ãŸã®ãŒã“ã¡ã‚‰ã§ã™ã€‚
http://tetz-lab.appspot.com/ranking/?type=sharding
id:bluerabbitã•ã‚“ã®ã€
http://d.hatena.ne.jp/bluerabbit/20091226/1261756546
ã‚’å‚考ã«ã•ã›ã¦ã„ãŸã ãã¾ã—ãŸã€‚ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã—ãŸã€‚m(__)m
ランã‚ング計算ã«ã‹ã‹ã‚‹æ™‚é–“ã¯åˆå›žã¯800〜1300ミリ秒程度ã¨å°‘々é…ã„ã‚‚ã®ã®ã€2回目以é™ã¯70〜200ミリ秒程度ã¨ãれ程変ã‚らãªã„速度ãŒå‡ºã¦ã„ã¾ã™ã€‚parallel getã£ã¦æ—©ã„ã‚“ã§ã™ã。
æ›´æ–°ã¯Entity一ã¤ã®å ´åˆã¨ã»ã¨ã‚“ã©å¤‰ã‚らãªã„値ãŒå‡ºã¦ã¾ã—ãŸã€‚
分散ã¸ã®è€ƒå¯Ÿãã®ï¼’−Entity分割方å¼
全点数を一ã¤ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«æ ¼ç´ã™ã‚‹ã®ã§ã¯ãªãã€é©å½“ãªç‚¹æ•°ã®ç¯„囲毎ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’分ã‘ã¦åˆ†æ•£ã•ã›ã‚‹ã‚¢ã‚¤ãƒ‡ã‚¢ã§ã™ã€‚
今回試ã—ã«å®Ÿè£…ã—ãŸã‚‚ã®ã¯0〜10万点ã®ç¯„囲ã§ä½œæˆã—ã¦ã„ã¾ã™ãŒã€ã“れを4096点毎ã«25個ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«åˆ†ã‘ã¦å®Ÿè£…ã—ãŸã®ãŒâ†“ã§ã™ã€‚
http://tetz-lab.appspot.com/ranking/?trn=gtx&type=divided
ランã‚ング計算ã«ã‹ã‹ã‚‹æ™‚é–“ã¯åˆå›žã¯600〜900ミリ秒程度ã€2回目以é™ã¯70〜150ミリ秒程度ã§ã—ãŸã€‚æ›´æ–°ã¯80〜150ミリ秒程度。EntityãŒå°ã•ããªã£ãŸåˆ†ã€è‹¥å¹²æ›´æ–°ãŒæ—©ã„ã¿ãŸã„ã§ã™ã€‚
ã—ã‹ã—ã“ã®æ–¹å¼ã ã¨ç‰¹å®šã®ç‚¹æ•°ã«è² è·ãŒé›†ä¸ã™ã‚‹ã¨ã‚¹ã‚±ãƒ¼ãƒ«ã—ãªã„ã®ã§ã€Entityã¸ã®è² è·ãŒé«˜ã¾ã£ã¦ããŸã‚‰ãã®Entityを分散カウンタ方å¼ã§åˆ†å‰²ã™ã‚‹ã€ã¨ã„ã£ãŸå¯¾å‡¦ã‚‚考ãˆãŸæ–¹ãŒã‚ˆã•ãã†ã§ã™ã€‚
最後ã«â€¦
ã©ã†ã‚‚最後ã¾ã§ãŠä»˜ãåˆã„ã„ãŸã ãã¾ã—ã¦ã€ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã—ãŸã€‚
ã‚‚ã—ソースã¿ãŸã„ãªã‚“ã¦æ–¹ãŒãŠã‚‰ã‚Œã¾ã—ãŸã‚‰ã€ã‚³ãƒ¡ãƒ³ãƒˆã§ã‚‚残ã—ã¦ç½®ã„ã¦ãã ã•ã„。