# HG changeset patch # User tatsuki # Date 1486893336 -32400 # Node ID 92d6882c114390cdb4ae8e45c3b56db5ee0ba4f0 # Parent 222d98af3372e177e81b2de559283c39cf5a12c6 add svg diff -r 222d98af3372 -r 92d6882c1143 slide/images/EditDifferencialTree.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/EditDifferencialTree.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,610 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/PushPopDemerit.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/PushPopDemerit.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,305 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/comparedb.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/comparedb.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,262 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/createIndex.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/createIndex.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,275 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/createListTree.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/createListTree.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,275 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/createRedBlackTreeAndDefaultTreeTime.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/createRedBlackTreeAndDefaultTreeTime.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,212 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/find.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/find.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,222 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/findDifTree.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/findDifTree.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,426 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/findTime.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/findTime.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,242 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/multiComponent.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/multiComponent.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,217 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/nodepath.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/nodepath.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,371 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/images/non_destructive_tree.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slide/images/non_destructive_tree.svg Sun Feb 12 18:55:36 2017 +0900 @@ -0,0 +1,795 @@ + + \ No newline at end of file diff -r 222d98af3372 -r 92d6882c1143 slide/slide.html --- a/slide/slide.html Sun Feb 12 18:09:55 2017 +0900 +++ b/slide/slide.html Sun Feb 12 18:55:36 2017 +0900 @@ -125,9 +125,11 @@
データベースには、複数のレコードをアップデートするときに、整合性を維持する仕組みとしてトランザクションがある。
データ構造には並行処理ようにスレッドセーフなものが用意されている。しかし、複数のスレッドセーフなデータ構造はアクセスするときに整合性を維持するトランザクションは自分で用意する必要があり、標準的なものは用意されていない。
特に複数のリストや木構造に対してトランザクションが必要になってきている。
+Jungleはゲームなどのアイテムのリストをそのまま木構造に格納することができ、トランザクションと持続性を提供する。
Jungleは様々な構造のデータ(例えばXML/JSON/LIST)を木構造としてそのまま格納することが可能である。
決まった版の木は変更されないので、いちいち木を検索することなく木構造をそのままプログラムのデータ構造として用いることができる。
-以下では、Jungleの構成要素と木へのアクセス方法を説明する。
木は複数のノードの集合でできており、その木の集合によりJungleが構成されている。
ノードは自身の子のリストと属性名と属性値の組でデータを持つ。これはデータベースのレコードに値する。
通常のレコードと異なり、ノードは自身の子供を持つ。
親から子への片方向の参照しか持たない。
- +データの変更は一度生成した木を上書きせず、ルートから変更を行うノードまでコピーを行い、新しく木構造を構築する。最後にルートをアトミックに入れ替えてコミットする。コミットが失敗した場合は最初からやり直す。
- +データの変更は一度生成した木を上書きせず、ルートから変更を行うノードまでコピーを行い、新しく木構造を構築する。
+<[>最後にルートをアトミックに入れ替えてCommitする。 +他のThreadとCommitが競合し失敗した場合は最初からやり直す。
+Jungleでは木のノードの位置をNodePathを使って表す。
ルートから対象のノードまでの経路を数字で指し示す。
ルートノードは例外として-1と表記される。
-NodePathクラスを用いて[-1,1,2,3]を表している例を以下に貼る。
- +NodePathクラスを用いて[-1,1,2,3]を表している例を以下に記述する。
+ @@ -247,23 +256,6 @@ - - -JungleTreeEditorが提供している木の編集APIを以下に記す。
-
-
-
-逆にルートを取り除き、その子供をルートにする操作(Pop)もO(1)である。
これらにより、線形木を高速に操作することができる。
Pushを連続で行うと、リストは逆順に構築される。
- +木のノードの追加順の線形リストが必要な場合もある。例えばLogなどである。
-Differential Jungle Treeは木の最後尾のノードへのポインタを持つ。
-最後尾に新しいノードをAtomicに書き込む。ルートは、版ごとに最後尾のノードを保持しており、 +
差分木は木の最後尾のノードへのポインタを持つ。
+最後尾に新しいノードをAtomicに書き込む。ルートは版ごとに最後尾のノードを保持しており、 木自体は変更されるが、その版の木の長さの範囲では変更されていない。
版ごとの最後尾を越えないようにアクセスすることで、線形木の非破壊性を維持することができる。
- +Differential Jungle Treeは、特別なAPIで作成する必要がある。
+ +差分木は、特別なAPIで作成する必要がある。
JungleTree createNewDifferenceTree(String treeName);
差分木への追加を複数回行うと、複数回のトランザクション処理を行う必要がある。 -複数の追加をSub Treeに対して破壊的に行って、そのSub Treeを差分木へ追加することにより、トランザクションを一回で済ませることができるようにしている。
+差分木への追加を複数回行うと、複数回のトランザクション処理を行う必要がある。
+ +複数の追加をSub Treeに対して破壊的に行って、そのSub Treeを差分木へ追加することにより、トランザクションを一回で済ませることができるようにしている。Differential Jungle Treeの編集例を以下の図に記す。
- +Default Jungle TreeへCommitは編集後の木のルートをAtomicに入れ替えることで行う。
しかしDifferential Jungle Treeは、ルートの入れ替えと、Editorが持つ木構造の末尾ノードへのAppendの2つのプロセスからなる。
@@ -402,7 +396,7 @@Jungleは木の編集時、ルートから編集を行う位置までのノードの複製を行う。
そのため、木の編集の手間は木構造の大きさにも依存している。
@@ -414,7 +408,7 @@Red Black Jungle Treeは、特別なAPIで作成する必要がある。
Red Black Jungle Treeは、ノードを追加、削除するたびに木のバランスが行われるため、各ノードのPathが変わってしまう。
その為、編集を加える際に、編集対象のノードのPathを調べる必要がある。
@@ -439,21 +433,23 @@Jungleに新しく追加した機能の性能測定を行う。
-新しく実装したTreeMapとFunctionalJavaのTreeMap
-IndexのFullアップデートと差分アップデート
-Default Jungle TreeとDefferential Jungle Tree
-Default Jungle Tree と Red Black Jungle Tree
-最後に既存のDBであるPostgreSQLとMongoDBとJungleの比較を行う。
+比較対象には、 TreeMap 実装前に Jungle で使用していた Functional Java の TreeMap を使用する。
TreeMap に1000回の Get を行った際のグラフである。
@@ -461,14 +457,14 @@X 軸は Get を行う TreeMap のノード数。
Y 軸は Get にかかった時間を表す。
--> - +新たに実装したTreeMapの方が極めて高速な検索を行えている。
理由として、JungleのTreeMapは二分探索木の探索アルゴリズムで探索するのに対して、Functional Javaは検索対象のノードがルートになる木を再構築し、ルートを返すといったアルゴリズムのを採用しているからである
@@ -477,7 +473,7 @@比較対象は、IndexのFullアップデートとする。
測定は木にノードを追加、Commitを1 セットの変更として行う。
@@ -485,12 +481,12 @@X 軸は、木に行った変更のセット数。
Y 軸は、木の構築にかかった時間を表す。
--> - +IndexのFullアップデートに比べて差分Updateの方が高速に木の構築に成功している。
期待通りの性能が出たといえる。
@@ -498,7 +494,7 @@Differential Jungle Treeの性能測定を行う。
比較対象はDefault Jungle Treeを選択した。
@@ -507,12 +503,12 @@X軸は構築した木のノード数。
Y 軸は構築にかかった時間を表す。
--> - +Commit毎に全てのノードの複製を行うDefault Jungle Treeに比べて、木の複製を行わないDifferential Jungle Treeが早いのは当然だといえる。
期待通りの性能が出た。
@@ -520,35 +516,34 @@比較対象は、Default Jungle Treeを選択した。
- +Red Black Jungle Treeは自身の木の形がIndexと同じ働きを持っている。
-なのでIndexを木の編集時作る必要がない。
Commit のたびにIndexを作っているDefault Jungle Treeより早くなるのは当然だといえる。
期待通りの性能が出た。
比較対象はMongoDBとPostgreSQLを選択した。
PostgreSQLはJson形式でデータを格納している。
データの検索速度を比較した。
- +MongoDBとPostgreSQLは、プログラム外にあるデータベースに通信を用いてアクセスしている。
Jungleは、メモリの中にデータを持ち通信を使わずデータにアクセスできる。
@@ -559,14 +554,15 @@Jungleの性能を向上させるために新たな要素を追加した。
実装後の測定では、全てが既存の木と比べて高速に動いていた。
また、Jungleは既存のDBと比較しても、極めて高速な検索が行えることがわかった。
@@ -575,7 +571,7 @@JungleはRDB と異なり格納するデータの自由度は大きい。
@@ -586,6 +582,16 @@