annotate paper/sigos.tex @ 13:c3eba0a845e5

sigos_ver10
author suruga
date Fri, 21 Apr 2017 20:14:17 +0900
parents d9898fbdd89c
children f5a7d3f090d3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
1 \documentclass[techrep]{ipsjpapers}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
2 \usepackage[dvipdfmx]{graphicx}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
3 \usepackage{url}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
4 \usepackage{listings,jlisting}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
5 \usepackage{enumitem}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
6
19917a6272f6 sigos_test
suruga
parents:
diff changeset
7
19917a6272f6 sigos_test
suruga
parents:
diff changeset
8 \lstset{
19917a6272f6 sigos_test
suruga
parents:
diff changeset
9 language=C,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
10 tabsize=2,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
11 frame=single,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
12 basicstyle={\ttfamily\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
13 identifierstyle={\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
14 commentstyle={\footnotesize\itshape},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
15 keywordstyle={\footnotesize\bfseries},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
16 ndkeywordstyle={\footnotesize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
17 stringstyle={\footnotesize\ttfamily},
19917a6272f6 sigos_test
suruga
parents:
diff changeset
18 breaklines=true,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
19 captionpos=b,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
20 columns=[l]{fullflexible},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
21 xrightmargin=0zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
22 xleftmargin=1zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
23 aboveskip=1zw,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
24 numberstyle={\scriptsize},%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
25 stepnumber=1,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
26 numbersep=0.5zw,%
19917a6272f6 sigos_test
suruga
parents:
diff changeset
27 lineskip=-0.5ex,
19917a6272f6 sigos_test
suruga
parents:
diff changeset
28 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
29 \renewcommand{\lstlistingname}{Code}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
30
19917a6272f6 sigos_test
suruga
parents:
diff changeset
31 \input{dummy.tex} %% Font
19917a6272f6 sigos_test
suruga
parents:
diff changeset
32
19917a6272f6 sigos_test
suruga
parents:
diff changeset
33 % ユーザが定義したマクロなど.
19917a6272f6 sigos_test
suruga
parents:
diff changeset
34 \makeatletter
19917a6272f6 sigos_test
suruga
parents:
diff changeset
35
19917a6272f6 sigos_test
suruga
parents:
diff changeset
36 \begin{document}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
37
19917a6272f6 sigos_test
suruga
parents:
diff changeset
38 % 和文表題
10
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
39 \title{非破壊木構造データベース Jungle のサービス利用法にそった改良}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
40 % 英文表題
19917a6272f6 sigos_test
suruga
parents:
diff changeset
41 \etitle{}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
42
19917a6272f6 sigos_test
suruga
parents:
diff changeset
43 % 所属ラベルの定義
19917a6272f6 sigos_test
suruga
parents:
diff changeset
44 \affilabel{1}{琉球大学大学院理工学研究科情報工学専攻 \\Interdisciplinary Information Engineering, Graduate School of Engineering and Science, University of the Ryukyus.}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
45 \affilabel{2}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
46
19917a6272f6 sigos_test
suruga
parents:
diff changeset
47 % 和文著者名
19917a6272f6 sigos_test
suruga
parents:
diff changeset
48 \author{
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
49 仲松 栞\affiref{2}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
50 \and
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
51 照屋 のぞみ \affiref{1}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
52 \and
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
53 河野 真治\affiref{1}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
54 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
55
19917a6272f6 sigos_test
suruga
parents:
diff changeset
56 % 英文著者名
19917a6272f6 sigos_test
suruga
parents:
diff changeset
57 \eauthor{
19917a6272f6 sigos_test
suruga
parents:
diff changeset
58 Nakamatsu Shiori\affiref{1}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
59 \and
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
60 Teruya Nozomi\affiref{2}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
61 \and
19917a6272f6 sigos_test
suruga
parents:
diff changeset
62 Shinji KONO\affiref{2}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
63 }
19917a6272f6 sigos_test
suruga
parents:
diff changeset
64
19917a6272f6 sigos_test
suruga
parents:
diff changeset
65 % 連絡先(投稿時に必要.製版用では無視される.)
19917a6272f6 sigos_test
suruga
parents:
diff changeset
66 \contact{仲松 栞\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
67 〒903-0213 沖縄県西原町千原1番地\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
68 琉球大学工学部情報工学科\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
69 TEL: (098)895-2221\qquad FAX: (098)895-8727\\
19917a6272f6 sigos_test
suruga
parents:
diff changeset
70 email: innparusu@cr.ie.u-ryukyu.ac.jp}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
71
19917a6272f6 sigos_test
suruga
parents:
diff changeset
72 % 和文概要
19917a6272f6 sigos_test
suruga
parents:
diff changeset
73 \begin{abstract}
13
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
74 現代のインターネットやアプリケーションで使われるデータは、複雑な構造を持っており、RDBの第一正規系には納まらないようになってきている。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
75 また、RDBでは、編集中にロックがかけられ、複雑な構造に対する変更に向いていない。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
76 これらの問題は、不定形のデータ構造とRDBの表構造のミスマッチである。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
77 これをDBのインピーダンスミスマッチと言うことがある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
78 そこで当研究室では、非破壊的木構造データベースJungleを開発している。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
79 Jungleでは、不定形のデータ構造を、直接木構造として格納することができる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
80 木構造の変更は、過去の版を保存する非破壊で行われ、木のルートをAtomicに入れ替える操作がトランザクションになる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
81 これにより、複雑な構造をDBとして素直に取り扱うことができる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
82 木構造の変更は、木の形に依存している。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
83 サービスやアプリケーションに適した木の形があり、それに対応した木の変更方法を採用する必要がある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
84 本研究ではJungleの木と Index の編集機能の改善を行う。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
85 直線的なリスト構造に適したPush/Popと差分リストを提案し、実装と評価を行なった。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
86 巨大な木が必要な場合は、木を特定のKeyを用いてbalanceさせることにより、変更をO(log n)にすることができる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
87 Jungleは分散構造を取ることもできる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
88 複数の木を複数の分散したJungleノード間で通信することにより、Jungleをスケールさせる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
89 Jungleの木の変更Logを当研究室で開発した分散フレームワークAliceを用いて通信する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
90 それぞれの木は、ルートノードに集約され、集約の過程で、競合する変更のMergeを行う。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
91 分散Jungleの性能を測定する手法について述べる。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
92 \end{abstract}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
93
19917a6272f6 sigos_test
suruga
parents:
diff changeset
94 % 表題などの出力
19917a6272f6 sigos_test
suruga
parents:
diff changeset
95 \maketitle
19917a6272f6 sigos_test
suruga
parents:
diff changeset
96
19917a6272f6 sigos_test
suruga
parents:
diff changeset
97 % 本文はここから始まる
19917a6272f6 sigos_test
suruga
parents:
diff changeset
98
19917a6272f6 sigos_test
suruga
parents:
diff changeset
99 % Introduce
10
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
100 \section{サービス利用に適したデータベース}
13
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
101 データのネスト構造を許さない第一正規系を要求するRDBの表構造は、Jsonなどの不定形のデータ構造とミスマッチを起こしてしまうという問題がある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
102 この問題はデータベースのインピーダンスミスマッチと呼ばれている。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
103 不定形の構造の変更をトランザクションとしてJsonの一括変更という形で処理する方法が考えられるが、並列処理が中心となってきている今のアプリケーションには向いているとは言えない。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
104 これらの問題を解決するため、当研究室では、分散処理環境で動くことができるデータベースを目指して非破壊的木構造データベースJungleを開発している。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
105 木構造を扱えることによって、従来のRDBとは異なり、XMLやJsonで記述された構造を、データベースを設計することなく読み込むことが可能である。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
106 また、その木をそのままデータベースとして使用することも可能である。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
107 非破壊的木構造とは、データの元の木を直接書き換えずに保存し、新しく構築した木のデータ構造を編集する方法である。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
108 これにより、データの書き込み中であっても、元のデータは変更されない為、読み込みも同時に行うことができる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
109 Jungleは、読み込みは高速に行える反面、書き込みの手間は木の形・大きさに依存しており、最悪の場合O(n)となってしまう。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
110 また、Index の構築も大幅なネックとなっていた。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
111 そこで、本研究ではJungleの木と Index の編集機能の改善を行う。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
112 また、分散環境におけるJungleの書き出し速度の測定方法の提案をする。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
113 \section{非破壊的木構造データベースJungle}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
114 Jungleは、当研究室で開発を行っている非破壊的木構造データベースで、Javaを用いて実装されている。非破壊的木構造とは、データの編集を一度生成した木を上書きせず、ルートから編集を行う位置までのノードをコピーする特徴を持つ(図\ref{fig:non_destructive_tree} )。これにより、読み込み中にデータが変更されないことが保証されているため、書き込みと読み込みを同時に行うことできる。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
115 %木のルートをAtomicに置き換えることで、木のアップデートを行う。変更前の木が残っているので、そのまま使用できる。変更されないノードは変更前と変更後のルートから共有されることになる。
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
116 \begin{figure}[ht]
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
117 \begin{center}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
118 \includegraphics[width=70mm]{./pic/non_destructive_tree.pdf}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
119 \end{center}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
120 \caption{非破壊的木構造の編集}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
121 \label{fig:non_destructive_tree}
3
07a31c08d082 add sigos_ver1_pdf
suruga
parents: 2
diff changeset
122 \end{figure}
12
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
123 Jungleは名前付きの複数の木の集合からなり、木は複数のノードの集合でできている。ノードは自身の子のリストと属性名、属性値を持ち、データベースのレコードに相応する。通常のレコードと異なるのは、ノードに子供となる複数のノードが付くところである。また、親と子相互で参照しあうことができる破壊的木構造データベースとは違い、非破壊的木構造であるJungleは、親から子への片方向の参照しかできない。通常のRDBと異なり、Jungleは木構造をそのまま読み込むことができる。例えば、XMLやJsonで記述された構造を、データベースを設計することなく読み込むことが可能である。また、この木を、そのままデータベースとして使用することも可能である。しかし、木の変更の手間は木の構造に依存する。特に非破壊木構造を採用しているJungleでは、木構造の変更の手間はO(1)からO(n)となりえる。つまり、アプリケーションに合わせて木を設計しない限り、十分な性能を出すことはできない。逆に、正しい木の設計を行えば高速な処理が可能である。Jungleは基本的にon memoryで使用することを考えており、一度、木のルートを取得すれば、その上で木構造として自由にアクセスして良い。Jungleは分散データベースを構成するように設計されており、分散ノード間の通信は木の変更のログを交換することによって行われる。持続性のある分散ノードを用いることでJungleの持続性を保証することができる。
10
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
124
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
125 \section{Jungleの構成要素}
12
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
126
10
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
127 \subsection*{[NodePath]}
5
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
128 Jungle では、木のノードの位置を NodePath クラスを使って表す。 NodePath クラスはルートノードからスタートし、対象のノードまでの経路を数字を用いて指し示す。また、ルートノードは例外として-1と表記される。 NodePath クラスを用いて \textless -1,0,2,3 \textgreater を表している際の例を(図\ref{fig:nodepath})に示す。
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
129
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
130 \begin{figure}[htpb]
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
131 \begin{center}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
132 \includegraphics[width=60mm]{./pic/nodepath.pdf}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
133 \end{center}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
134 \caption{NodePath}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
135 \label{fig:nodepath}
bec6eb1e0297 sigos_3
suruga
parents: 4
diff changeset
136 \end{figure}
12
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
137
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
138 \subsection*{[Index]}
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
139 Jungleは、非破壊的木構造というデータ構造上、過去の版の木構造を全て保持している。よって、すべての版に独立したIndexが必要となるため、前の版のIndexを破壊すること無く、Indexを更新する必要がある。既存の TreeMap では、一度 Index の複製を行い、その後更新する必要があったため、Indexの更新オーダーがO(n)となっていた。その問題を解決するため、Java 上で関数型プログラミングを行えるライブラリである、 Functional Java の TreeMap を使用し、それを用いてIndexは実装されている。この TreeMap は、 Jungle と同じようにルートから変更を加えたノードまでの経路の複製を行い、データの更新を行なった際、前の版と最大限データを共有した新しい TreeMap を作成する。JungleでIndexを実装した場合と違いは、木の回転処理が入るという点である。これにより複数の版すべてに対応した Index をサポートすることが可能になった。
10
321952dbf59a fix title, column name, etc
suruga
parents: 9
diff changeset
140 \subsection*{[非破壊TreeMap]}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
141 Jungle の Index は、Functional Java の非破壊 TreeMap を用いて実装を行なっている。しかし、Functional Java の TreeMap は、木の変更の手間が大きい、並列実行処理速度が落ちるなど、実用的な性能を持っていなかった。そのため、Jungleの性能も、TreeMap 部分がネックとなっていた。その問題を解決するため、 Jungle で使用する非破壊 TreeMap を作成した。TreeMap は、Red Black Tree のアルゴリズムを用いている。RedBlackTreeとは二分木探索の一つで、以下の条件を満たした木のことである。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
142 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
143 \item 各ノードは赤か黒の色を持つ。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
144 \item ルートノードは黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
145 \item 全ての葉は黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
146 \item 赤いノードの子は黒色である。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
147 \item 全ての葉からルートノードまでのパスには、同じ個数の黒いノードがある。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
148 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
149 %ここもうちょっとかく。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
150 \section{Indexの差分Updateの実装}
9
d8dd8d66a9b5 fix indent
suruga
parents: 8
diff changeset
151 Jungleは木の編集を行う際に、編集を行うノードと、経路にあるノードの複製を行い新しい木構造を構築するため、 Index の中には、編集後の木には存在しない複製前のノードが残ってしまう。なので、 Index の差分 Update を行う際には、それらのノードを Index から削除して、新しく複製されたノードを Index に登録する必要がある。そのためには、編集を行なったノードを覚えておく必要がある。そこで、 Jungle Tree Editor 内に、編集を加えたノードを覚えておくためのリストを定義した。 Editor は木に編集を加えた際、リストに編集前のノードを保存する。そして、Commit 時にリストにあるノードを使って Index の中に残っている、編集後の木に存在しないノードを削除する。その後、新しく作られたノードを Index に登録して Update は終了する。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
152
19917a6272f6 sigos_test
suruga
parents:
diff changeset
153
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
154 \paragraph* {編集前ののノードの削除}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
155 ndex のUpdate を行う際、初めに、編集後の木に存在しないノードを Index から削除する。削
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
156 除の対象は、変更を加えたノードと、ルートから変更を加えたノードまでの経路にあるノード
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
157 である。ノードの削除は、以下の手順で行われる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
158 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
159 \item 編集を行なったノードのリストからノードを取得する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
160 \item 取得したノードが、保持している値をIndex から削除する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
161 \item 自身と子供のペアを Parent Index から削除する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
162 \item ParentIndex から親を取得する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
163 \item 2 - 4 をルートノードにたどり着くか、 ParentIndex から親を取得できなkなるまで続ける。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
164 \item 1 - 5 をリストからノードが無くなるまで続ける。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
165 \end{itemize}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
166 Parent Index に現在のノードが登録されていない場合は、現在のノードからルートまでの経路にあるノードはIndexから削除されているため、削除を終えて、リストに入っている次のノードの削除処理を行なっても構わない。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
167
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
168 \paragraph* {Indexへのノードの挿入}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
169 Index から不要なノードを削除した後は、木の編集時新しく作られたノードを Index に挿入する。ノードの挿入は、以下の手順で行われる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
170 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
171 \item 木からルートノードを取得する
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
172 \item 取得したノードがIndex に登録されているかを調べる。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
173 \item 登録されている場合、そのノード以下の Sub treeは、全てIndexに登録されているので、次のノードに移動する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
174 \item 登録されていなかった場合、自身が保持している値をIndex に登録する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
175 \item 自身と子ノードを Parent Index に登録する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
176 \item 自身の子ノードを取得したノードとして2に戻る。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
177 \item 全てのノードを登録したら終了する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
178 \end{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
179
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
180 \section{Differential Jungle Treeの実装}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
181 Jungleは木の編集時、ルートから編集を行う位置までのノードの複製を行う。そのため、木の編集の手間は、木構造の形によって異なる。特に線形の木は、全てのノードの複製を行うため、変更の手間がO(n)になってしまう。そこで、Jungleは、線形の木をO(1)で変更するPushPop の機能を持つ。PushPop とは、ルートノードの上に新しいルートノードを付け加える API である(図\ref{fig:PushPopDemerit} )。すると、木の複製を行う必要が無いため、木の変更の手間がO(1)でノードの追加を行える。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
182 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
183 \begin{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
184 \includegraphics[width=70mm]{./pic/PushPopDemerit.pdf}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
185 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
186 \caption{PushPop}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
187 \label{fig:PushPopDemerit}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
188 \end{figure}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
189 しかし、PushPopはルートノードを追加していくため、(図\ref{fig:PushPopDemerit} )のようにノードの並びが逆順になってしまう。Logなどの正順の木でなければデータを表現できない場合、木の編集時PushPop を使用できない。そこで、木の編集の手間を O(1) で、正順の木を構築できるDifferential Jungle Tree の実装を行なった。 Differential Jungle Tree は。木のバージョンごとに、自身の木の最後尾を表す末尾ノードを保持する。木の編集は、別途構築したSub Tree に対して破壊的に更新を行い、Commit 時に末尾のノードに Sub Tree を Append することで行う。この場合は木が破壊的に変更されているように見えるが、前の版の末端部分を超えてアクセスすることがなければ複数の版を同時に使用することができる。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
190
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
191 \paragraph* {Differential Tree Context}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
192 Jungleの木はTreeContext というオブジェクトに自身の木の情報を保持している。Differential Jungle Tree では、現在の版の木構造の末尾ノードを保持することが可能な Differential Tree Context を作成した。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
193
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
194 \paragraph* {Differential Jungle Tree の作成}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
195 Differential Jungle Tree を作成するためにJungle に、新しいAPIを実装した。(表\ref{table:Differential API})
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
196
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
197 \begin{table}[htb]
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
198 \begin{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
199 \caption{Jungleに新しく実装したAPI}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
200 \begin{tabular}{|p{3cm}|p{4cm}|} \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
201 \hline \shortstack{ createNewDifferenceTree\\ (StringtreeName)}& Jungleに新しくDifferential Jungle Treeを生成する。木の名前が重複した場合、生成に失敗し null を返す。\\
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
202 \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
203 \end{tabular}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
204 \label{table:Diffetential API}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
205 \end{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
206 \end{table}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
207
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
208
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
209 \paragraph* {末尾ノードを使用した木の編集}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
210 Differential Jungle Tree の木の編集は、Differential Jungle Tree Editor を使用して行う。 Differential Jungle Tree Editor は、Default Jungle Tree Editor と違い、生成時に新しい木構造(Sub Tree)を自身の中に構築する。そして、木の編集は、Editor が保持している木構造に対して行う。編集後、Commit を行う際に構築した木構造を、 Differential Jungle Tree の末尾ノードにAppend する。その際木の複製は行わない。
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
211  また、Differential Tree は自身が保持している木構造に対する変更しか行えないため、一度Commit した木に対して変更は行えない。(図\ref{fig:EditDifferencialTree})
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
212
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
213 \begin{figure}[ht]
19917a6272f6 sigos_test
suruga
parents:
diff changeset
214 \begin{center}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
215 \includegraphics[width=80mm]{./pic/EditDifferencialTree.pdf}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
216 \end{center}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
217 \caption{末尾ノードを使用した木の編集}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
218 \label{fig:EditDifferencialTree}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
219 \end{figure}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
220
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
221 \begin{itemize}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
222 \item 木からgetJungleTreeEditor で Editor を取得する。(このとき Editor は新しい木構造(Sub Tree)を持つ)。
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
223 \item Editorが保持している木構造に対して addNewChild( \textless-1.0\textgreater)を実行し、ノードの追加を行う。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
224 \item Commit を行い、Treeの末尾ノードにEditorが保持している木構造を Append する。
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
225 \end{itemize}
9
d8dd8d66a9b5 fix indent
suruga
parents: 8
diff changeset
226 Editor が保持している木構造に最後に追加したノードが、新しい木の末尾ノードとなる。また、Differential Jungle Tree は、木の編集時複製を行わないため、 Index のアップデートは、 Editor が保持している木構造のデータを Index に追加するだけで良い。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
227
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
228 \paragraph* {Differential Jungle Tree の検索}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
229 Differential Jungle Tree は、末尾ノードを使って、現在の木構造を表現している。なので、過去の木に対して全探索を行なった場合、その版には無いはずのノードが取得できてしまう。例として、編集前の木である Tree ver1 と編集後の木である Tree ver2 があるとする(図\ref{fig:Differential_Interface_Traverser})。ここで、Tree ver1 に対して、全探索を行なった場合、本来Tree ver1 に存在しないノード3・4も検索対象に含まれてしまう。そこで、その版の木が持つ末尾ノード以下のSub Tree を検索対象から除外する、Differential Interface Traverser を実装した。Differential Interface Traverserを用いて木の全探索を行なった場合、Tree ver1 に存在しないノード3・4は検索対象から省かれる。
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
230
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
231 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
232 \begin{center}
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
233 \includegraphics[width=60mm]{./pic/Differential_Interface_Traverser.pdf}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
234 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
235 \caption{複数の版の木の表現}
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
236 \label{fig:Differential_Interface_Traverser}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
237 \end{figure}
9
d8dd8d66a9b5 fix indent
suruga
parents: 8
diff changeset
238 Index を使用した検索を行う場合、各版の木に対応した Index があるため、Default Tree と検索のアルゴリズムは変わらない。これらの実装により Differential Jungle Tree は木構造の構築・検索を行う。
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
239
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
240 \paragraph* {Differential Jungle Tree の検索}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
241 Differential Jungle Tree への Commit は、編集後の木のデータを持つ TreeContext を作り、編集前の木が持つ TreeContext と Atomic に入れ替えることで行われる。しかし、Differential Jungle Tree のCommit は、Default Jungle Tree の Commit と異なり、TreeContext の入れ替えと、 Editor が保持している木構造の末尾ノードへの Append の2つのプロセスからなる。 TreeContext の入れ替えに関しては、 Default Jungle Tree と同じように行い、末尾ノードへの Editor が持っている木構造の Append は、TreeContect の入れ替えが成功した後に行う。そうすることで、別Thread で行われている Commit と競合した際に、 TreeContext を入れ替えた Thread と別 Thread がAppend を行い、木の整合性が崩れることを回避している。また、過去の版の木に対して、編集を加えCommit を行なった場合、木の整合性が崩れてしまう問題もある。(図\ref{fig:Differential_Interface_Traverser})(\ref{fig:Tree_ver2})を例に解説する。(図\ref{fig:Differential_Interface_Traverser})の過去の版の木 Tree ver1 に新しいノード5を追加・Commit を行うと、新しい木 Tree ver'2 が構築される。ここで、Tree ver'2 に対して全検索を行う。differential Jungle Tree に対する全検索は、末尾ノードよ上にあるノードを検索対象にする。しかしノード3・4という、本来存在しないはずのノードが検索対象に含まれてしまう。これは、過去の版の木である、 tree ver1 の末尾ノードが2つの子ノードを持っているせいで発生する。この問題を解決するために、Differential Jungle Tree では、過去の木に対する変更を禁止している。具体的には。末尾ノードは子を1つしか持つことができないようにした。そうすることで木の整合性を保証している。
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
242
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
243
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
244 \begin{figure}[ht]
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
245 \begin{center}
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
246 \includegraphics[width=50mm]{./pic/Tree_ver2.pdf}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
247 \end{center}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
248 \caption{木の整合性が崩れる例}
7
ad41c4a44428 sigos_ver5
suruga
parents: 6
diff changeset
249 \label{fig:Tree_ver2}
2
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
250 \end{figure}
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
251
66a48dc3b319 sigos_ver1
suruga
parents: 1
diff changeset
252 \section{Red Black Jungle Tree の実装}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
253 Jungle は木に編集を加えた際、ルートから編集を行う位置までのノードをコピーする。その為、木の編集の手間は木の大きさにも依存している。バランスの取れた木構造を構築することで、編集の手間をO(log n)にすることは可能だが、Default Jungle Tree の場合、ユーザーがPath を用いて、バランスを取りながら木を構築する必要がある。しかし、ユーザーが全ての木構造の形を把握し、バランスの取れた木を構築するのは困難である。そこで、自動で木のバランスを取り、最適な形の木構造を構築する機能を持つ Red Black Jungle Tree を実装した。バランスは、木の生成時に特定の Balance Key を決定し、それを使って行う。木のバランスを取るアルゴリズムは、前述した非破壊 TreeMap と同じものを使用する。しかし、木の編集を加えた際、木がどのようにバランスを取るか予想するのは困難であるため、木構造自体がデータを表現していない場合に限る。また、自身の木構造が、Balance Key を使った Index と同じ働きを持つため、木のCommit 時に別途 Index を構築する必要が無い、といったメリットもある。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
254
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
255 \paragraph* {Red Black Jungle Tree の作成}
8
6b61e24c14c2 sigos_ver6 : add abstract
suruga
parents: 7
diff changeset
256 Red Black Jungle Tree を作成するため、Jungle に新しいAPIを実装した。(表\ref{table:Diffetential API})
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
257
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
258 \begin{table}[htb]
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
259 \begin{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
260 \caption{Jungleに新しく実装したAPI}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
261 \begin{tabular}{|p{3cm}|p{4cm}|} \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
262 \hline \shortstack{ createNewRedBlackTree\\ (StringtreeName, \\String balanceKey)}& Jungleに新しくRed Black Jungle Treeを生成する。第一引数に木の名前、第2引数に木のバランスを取る時に使用する Balance Key を受け取る。木の名前が重複した場合、生成に失敗し null を返す。\\
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
263 \hline
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
264 \end{tabular}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
265 \label{table:Diffetential API}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
266 \end{center}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
267 \end{table}
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
268
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
269 \paragraph* { NodePath の拡張}
9
d8dd8d66a9b5 fix indent
suruga
parents: 8
diff changeset
270 Red Black Jungle Tree は、ノードを追加・削除するたびに木のバランスが行われ、各ノードの Path が変わってしまう。その為、数
d8dd8d66a9b5 fix indent
suruga
parents: 8
diff changeset
271 字を使った NodePath では、編集を加える際、編集対象のノードの Pathを毎回調べる必要がある。その問題を解決するためにNodePath を拡張した Red Black Tree Node Path を作成し、属性名 BalanceKey 属性値 value のペアでノードを指定できるようにした。 Red Black Jungle Node Path は、引数に String 型の BalanceKey と ByteBuffer 型の value を取る。
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
272 %サンプル要りますでしょうか
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
273 Red Black Tree Node Path で指定できる属性名は、木の生成時に宣言した属性名しか使用できない。これは、Red Black Jungle Tree が木の生成時に宣言した属性名でソートされているからである。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
274
4
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
275 %\paragraph* { Red Black Jungle Tree の編集}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
276  %Red Black Jungle Tree Editor は、既存の Jungle Tree Editor とくらべてAPIの使い方が異なる。以下にDefault Jungle Tree と Red Black Jungle Tree Editor のAPIの使い方の違いを記述する。
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
277 %\paragraph* { Jungle Red Black Tree の検索}
0c8bb16afb8d sigos_ver2
suruga
parents: 3
diff changeset
278 %編集と検索をいれるか迷います。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
279
19917a6272f6 sigos_test
suruga
parents:
diff changeset
280 %Code \ref{src: "src"フォルダの中のコードのファイル名}で、文章中にコードの指定ができる。
19917a6272f6 sigos_test
suruga
parents:
diff changeset
281 %\lstinputlisting[label=src:ファイル名, caption=Enqueue]{./src/ファイル名.拡張子}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
282
19917a6272f6 sigos_test
suruga
parents:
diff changeset
283
19917a6272f6 sigos_test
suruga
parents:
diff changeset
284 \section{分散環境でのJungleDBの書き出し実験方法の提案}
13
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
285 Jungleは分散環境で動くデータベースを目指して開発している。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
286 Jungleには大量の様々な木が存在し、その大きさも様々である。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
287 それぞれの木を異なるJungleノードに格納することにより、木が大量になる場合にも一定した性能が出るようにしたい。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
288 一つの木が極端に大きくなる場合もあるが、それを分散して格納するのは難しい。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
289 ここでは、一つの木は一つのノードに納まる大きさだと仮定する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
290 Jungleの木は信頼性向上とアクセス速度の向上のために、複数のノードに格納される。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
291 木の変更は複数のノードを伝搬し、特定のJungleの木のルートノードに到達する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
292 そこで、木の状態が確定する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
293 一つのルートノードではなく、複数のノードに対して、多数決などの方法を用いることも考えられるが、
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
294 今回は単一のルートノードを用いる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
295 この方法は、読み込みに対して書き込みが少ない場合、あるいは書き込みが単一ノードのみからくる場合に有効であると考えられる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
296
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
297 従来のJungleDBの分散機能の測定はJetty Webサーバー込みで行なっており、DBに対する負荷は直接的には大きくなかった。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
298 JungleDBに対して十分な負荷をかけるhttpリクエストを生成するのは困難であった。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
299 そこで、Jungleの分散性能そのものを調べるために、Webサーバー抜きで測定したい。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
300
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
301 JungleDBの通信は、研究室で開発した分散フレームワークAliceによって行われる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
302 Aliceはノードの木構造接続を自動的に行うTopologyManagerを持っている。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
303 ここでは、Jungleの木それぞれに対してノードの木構造を別々に構成する必要がある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
304 これは、TopologyManagerを改良することによって行う。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
305 Aliceはまた、通信を圧縮して行う機能も持っており、それによる高速化も期待できる。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
306 通信されるのは、Jungleの木に対する変更Logであり、これをまとめて転送することにより、圧縮がうまく働くと期待される。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
307 複数のノードの変更は、互いに競合することがあり、ノード間をルートに向かって通信していく間に競合を解消する必要がある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
308 これをMergeをいう。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
309 従来のDBのような変更では、Mergeが失敗することがある。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
310 失敗した場合は、複数の木構造がまとめて失敗してしまう。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
311 JungleではMergeが失敗しないような場合、例えば、SNSへのコメントの追加などではうまく働く。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
312 従来のDBとしてJungleを使う場合には、単一ノードで使用するか、多数決Commitを使うことになるが、ここではそれは測定しない。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
313
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
314 今回、実験で分散構造としてJungleの動くノード16台を木構造に接続する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
315 この木のルートノードをルートjungleと呼び、末端ノードをリーフjungleと呼ぶ。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
316 (図)
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
317 まず、末端のJungleにUserが書き込みをし、Jungleからuserにレスポンスが返ってくるまでの時間を測定する。
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
318 次に、Jungleの変更がルートのJungleにコピーされるまでの時間の測定方法を提案するJungle同士の接続には、当研究室で開発している分散フレームワークであるAliceを用いる。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
319 \section{まとめ}
12
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
320 本研究では、始めに破壊的木構造データベースであるJungleについて説明を行い、次にJungleの性能を上げるために実装した点を挙げ、最後に分散環境での Jungle の書き出し実験の手法について述べた。実装した点は、まず Jungle の Index の Update を高速化させるために、前の版の Index と値を共有しながら Update を行う、差分 Update の実装を行なった。次に、線形の木を正順で構築する際、木の変更の手間が O(n) になる問題を解決するために、 Differential Jungle Tree の実装をした。 Differential Jungle Tree は、自身の末尾のノードの情報を保持している。この末尾ノードを使用して、木の編集や検索を行う。次に、自動的に木のバランスを行い、最適な形の木構造を構築する Red Black Jungle Tree を実装した。 Red Black Jungle Tree は、自身が Index を構築する Default Jungle Tree により、編集できる。また、ノードは、木のバランスによって Path が編集ごとに変わってしまうため、属性名と属性値のペアでノードを指定できる、 Red Black Jungle Tree Editor の実装を行なった。
13
c3eba0a845e5 sigos_ver10
suruga
parents: 12
diff changeset
321 また、Jungleの分散機能に対する測定手法を提案した。
12
d9898fbdd89c sigos_ver9
suruga
parents: 10
diff changeset
322 今後の課題として、Jungleは非破壊でデータを保持し続けるため、非常に多くのメモリを使用してしまう。ある程度の単位で過去のデータの掃除を行いたい。Jungleは、過去の木に対するアクセスをサポートしているため、データの掃除を行うタイミングが明確ではない。なので、メモリから追い出すタイミングを定義する必要がある。
1
19917a6272f6 sigos_test
suruga
parents:
diff changeset
323
19917a6272f6 sigos_test
suruga
parents:
diff changeset
324
19917a6272f6 sigos_test
suruga
parents:
diff changeset
325 %参考文献 
19917a6272f6 sigos_test
suruga
parents:
diff changeset
326 \nocite{*}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
327 \bibliographystyle{ipsjunsrt}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
328 \bibliography{sigos}
19917a6272f6 sigos_test
suruga
parents:
diff changeset
329
19917a6272f6 sigos_test
suruga
parents:
diff changeset
330 \end{document}