changeset 16:a3c5125aea03

add images
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Wed, 20 Jan 2016 17:02:45 +0900
parents c686d33ba1c7
children ea3e6f3219a5
files .hgignore c2.tex c3.tex c4.tex c5.tex images/implementation/CharClassMergePattern.bb images/implementation/ccinsert1.bb images/implementation/ccinsert1.pdf images/implementation/ccinsert2.bb images/implementation/ccinsert2.pdf images/implementation/ccinsertresult.bb images/implementation/ccinsertresult.pdf images/implementation/cfab.bb images/implementation/cfab.pdf images/implementation/cfdg.bb images/implementation/cfdg.pdf images/implementation/cfdgab.bb images/implementation/cfdgab.pdf images/implementation/dfa.bb images/implementation/dfa.pdf images/implementation/efgi.bb images/implementation/efgi.pdf images/implementation/nfa.bb images/implementation/nfa.pdf paper.mm
diffstat 25 files changed, 201 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,1 @@
+.DS_Store
--- a/c2.tex	Wed Jan 20 16:16:46 2016 +0900
+++ b/c2.tex	Wed Jan 20 17:02:45 2016 +0900
@@ -142,90 +142,6 @@
 
 Input/Output Data、Parameter は関数の引数に相当する。
 Cpu Type は Task を動作させるデバイスを設定することができ、Dependency は他の Task との依存関係を設定することができる。
-\newpage
-\section{並列処理向け I/O}
-ファイル読み込みなどの I/O を含むプログラムは、読み込み時間が Task の処理時間と比較してオーバーヘッドになることが多い。
-計算処理の並列化を図ったとしても I/O がボトルネックになってしまい処理全体が高速にならない。
-本項では Cerium に実装した並列処理用 I/O を行ない、I/O 部分の高速化を図った。
 
-Cerium の例題ではファイル読み込みを mmap にて実装していた。
-しかし、mmap だとファイルを読み込んでから Task を実行するので、読み込んでいる間は他の CPU が動作せず並列度が落ちる。
-
-mmap は function call 後にすぐにファイルを読みに行くのではなく、仮想メモリ領域にファイルの中身を対応させる。
-その後メモリ空間にアクセスされたときに、OS が対応したファイルを読み込む。
-また、読み込む方法が OS 依存となってしまうため環境に左右されやすく、プログラムの書き手が読み込みの制御をすることが難しい。
-
-図\ref{fig:mmap}は mmap で読み込んだファイルに対して Task1 、 Task2 がアクセスしてそれぞれの処理を行うときのモデルである。
-
-Task1 が実行されると仮想メモリ上に対応したファイルが読み込まれ、読み込み後 Task1 の処理が行われる。
-その後 Task2 も Task1 と同様の処理が行われるが、これら 2 つの Task の間に待ちが入る。
-
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.7]{images/cerium/mmap.pdf}
-  \end{center}
-  \caption{mmap Model}
-  \label{fig:mmap}
-\end{figure}
-
-mmap を使わず、読み込みを独立した Thread で行ない、ファイルを一度に全て読み込むのではなくある程度の大きさ(Block)分読み込み、読み込まれた部分に対して並列に Task を起動する。
-これを Blocked Read と呼び、高速化を図った。
-
-Blocked Read を実装するにあたり、WordCount を例題に挙げる。
-ファイルを読み込む Task (以下、ReadTask) と、読み込んだファイルに対して計算を行う Task (以下、WordCount) を別々に生成する。ReadTask は一度にファイル全体を読み込むのではなく、ある程度の大きさで分割してから読み込みを行う。分割して読み込んだ範囲に対して WordCount を行う。
-
-WordCount を Blocked Read で読み込み処理をしたとき以下の図\ref{fig:BlockedRead}の様になる。
-
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.5]{./images/cerium/blockedread.pdf}
-  \end{center}
-  \caption{BlockedRead による WordCount}
-  \label{fig:BlockedRead}
-\end{figure}
-
-Task を一定の単位でまとめた Task Block ごとに生成して WordCount を行なっている。
-Task Block で計算される領域が Blocked Read で読み込む領域を追い越して実行してしまうと、まだ読み込まれていない領域に対して計算されてしまう。
-その問題を解決するために依存関係を適切に設定する必要がある。
-Blocked Read による読み込みが終わってから TaskBlock が起動されるようにするため、Cerium の API である wait\_for にて依存関係を設定する。
-
-また、ReadTask は連続で処理される必要がある。
-なぜならば、ReadTask でファイルを読み込む前提で WordCount がその領域に対して計算を行うので、ReadTask の処理が遅くなってしまうだけでオーバーヘッドとなってしまう。\ref{fig:BlockedReadModel}
-
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.5]{./images/cerium/blockedreadimage.pdf}
-  \end{center}
-  \caption{BlockedRead Model}
-  \label{fig:BlockedReadModel}
-\end{figure}
-
-\newpage
-Blocked Read を実装することにより、読み込み部分と処理部分の並列化を行なった。Blocked Read は連続で読み込まれる必要があるため、さらに I/O 専用 thread を実装した。
-
-Cerium Task Manager では、それぞれの Task に対してデバイスを設定することができる。
-SPE\_ANY 設定をすると、Task Manager が CPU の割り振りを自動的に行う。
-Blocked Read は連続で読み込まれなければならないが、SPE\_ANY で設定すると Blocked Read 間に別の Task が割り込まれる恐れがある。(図\ref{fig:spe_any_blockedread})
-
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.7]{./images/cerium/speblockedread.pdf}
-  \end{center}
-  \caption{BlockedRead と Task を同じ thread で動かした場合}
-  \label{fig:spe_any_blockedread}
-\end{figure}
-
-Task が Blocked Read 間に割り込まれないようにするため、I/O 専用 thread である iO\_0 の設定を追加した。
-
-IO\_0 は SPE\_ANY とは別 thread の scheduler で動作するので、SPE\_ANY で動作している Task に割り込むことはない。
-しかし、読み込みの終了を通知し、次の read を行う時に他の Task がスレッドレベルで割り込んでしまう事がある。
-pthread\_getschedparam() で IO\_0 の priority の設定を行う必要がある(図:\ref{fig:iothread_blockedread})。
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.7]{./images/cerium/iothread.pdf}
-  \end{center}
-  \caption{IO Thread による BlockedRead}
-  \label{fig:iothread_blockedread}
-\end{figure}
-
-IO\_0 で実行される Task は Blocked Read のみで、さらに IO\_0 の priority を高く設定することにより Blocked Read が他の Task に割り込まれることなく連続に実行される。
+\section{Cerium における Task}
+\section{Task Scheduling}
--- a/c3.tex	Wed Jan 20 16:16:46 2016 +0900
+++ b/c3.tex	Wed Jan 20 17:02:45 2016 +0900
@@ -1,86 +1,86 @@
-\chapter{正規表現の設計と実装}
-\section{正規表現構文木の生成}
-\section{Transition List の生成}
-\section{Subset Construction}
-\section{Cerium 上での実装}
+\chapter{並列処理向け I/O}
+ファイル読み込みなどの I/O を含むプログラムは、読み込み時間が Task の処理時間と比較してオーバーヘッドになることが多い。
+計算処理の並列化を図ったとしても I/O がボトルネックになってしまい処理全体が高速にならない。
+本項では Cerium に実装した並列処理用 I/O を行ない、I/O 部分の高速化を図った。
+
+Cerium の例題ではファイル読み込みを mmap にて実装していた。
+しかし、mmap だとファイルを読み込んでから Task を実行するので、読み込んでいる間は他の CPU が動作せず並列度が落ちる。
 
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/CharClassMergePattern.pdf}
-  \end{center}
-  \caption{2つの Character Class を merge するときの全パターン}
-  \label{fig:CharClassMergePattern}
-\end{figure}
+mmap は function call 後にすぐにファイルを読みに行くのではなく、仮想メモリ領域にファイルの中身を対応させる。
+その後メモリ空間にアクセスされたときに、OS が対応したファイルを読み込む。
+また、読み込む方法が OS 依存となってしまうため環境に左右されやすく、プログラムの書き手が読み込みの制御をすることが難しい。
+
+図\ref{fig:mmap}は mmap で読み込んだファイルに対して Task1 、 Task2 がアクセスしてそれぞれの処理を行うときのモデルである。
+
+Task1 が実行されると仮想メモリ上に対応したファイルが読み込まれ、読み込み後 Task1 の処理が行われる。
+その後 Task2 も Task1 と同様の処理が行われるが、これら 2 つの Task の間に待ちが入る。
 
 \begin{figure}[htpb]
   \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/ccinsert1.pdf}
+    \includegraphics[scale=0.7]{images/cerium/mmap.pdf}
   \end{center}
-  \caption{Character Class を二分木で表示}
-  \label{fig:ccinsert1}
+  \caption{mmap Model}
+  \label{fig:mmap}
 \end{figure}
 
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/ccinsert2.pdf}
-  \end{center}
-  \caption{ある Character Class の二分木に対して、新しい Character Class を insert}
-  \label{fig:ccinsert2}
-\end{figure}
+mmap を使わず、読み込みを独立した Thread で行ない、ファイルを一度に全て読み込むのではなくある程度の大きさ(Block)分読み込み、読み込まれた部分に対して並列に Task を起動する。
+これを Blocked Read と呼び、高速化を図った。
 
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/ccinsertresult.pdf}
-  \end{center}
-  \caption{insert 後の Character Class の二分木}
-  \label{fig:ccinsertresult}
-\end{figure}
+Blocked Read を実装するにあたり、WordCount を例題に挙げる。
+ファイルを読み込む Task (以下、ReadTask) と、読み込んだファイルに対して計算を行う Task (以下、WordCount) を別々に生成する。ReadTask は一度にファイル全体を読み込むのではなく、ある程度の大きさで分割してから読み込みを行う。分割して読み込んだ範囲に対して WordCount を行う。
+
+WordCount を Blocked Read で読み込み処理をしたとき以下の図\ref{fig:BlockedRead}の様になる。
 
 \begin{figure}[htpb]
   \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/cfab.pdf}
+    \includegraphics[scale=0.5]{./images/cerium/blockedread.pdf}
   \end{center}
-  \caption{cfab}
-  \label{fig:cfab}
+  \caption{BlockedRead による WordCount}
+  \label{fig:BlockedRead}
 \end{figure}
 
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/cfdg.pdf}
-  \end{center}
-  \caption{cfdg}
-  \label{fig:cfdg}
-\end{figure}
+Task を一定の単位でまとめた Task Block ごとに生成して WordCount を行なっている。
+Task Block で計算される領域が Blocked Read で読み込む領域を追い越して実行してしまうと、まだ読み込まれていない領域に対して計算されてしまう。
+その問題を解決するために依存関係を適切に設定する必要がある。
+Blocked Read による読み込みが終わってから TaskBlock が起動されるようにするため、Cerium の API である wait\_for にて依存関係を設定する。
+
+また、ReadTask は連続で処理される必要がある。
+なぜならば、ReadTask でファイルを読み込む前提で WordCount がその領域に対して計算を行うので、ReadTask の処理が遅くなってしまうだけでオーバーヘッドとなってしまう。\ref{fig:BlockedReadModel}
 
 \begin{figure}[htpb]
   \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/cfdgab.pdf}
+    \includegraphics[scale=0.5]{./images/cerium/blockedreadimage.pdf}
   \end{center}
-  \caption{cfdgab}
-  \label{fig:cfdgab}
+  \caption{BlockedRead Model}
+  \label{fig:BlockedReadModel}
 \end{figure}
 
+\newpage
+Blocked Read を実装することにより、読み込み部分と処理部分の並列化を行なった。Blocked Read は連続で読み込まれる必要があるため、さらに I/O 専用 thread を実装した。
+
+Cerium Task Manager では、それぞれの Task に対してデバイスを設定することができる。
+SPE\_ANY 設定をすると、Task Manager が CPU の割り振りを自動的に行う。
+Blocked Read は連続で読み込まれなければならないが、SPE\_ANY で設定すると Blocked Read 間に別の Task が割り込まれる恐れがある。(図\ref{fig:spe_any_blockedread})
+
 \begin{figure}[htpb]
   \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/efgi.pdf}
+    \includegraphics[scale=0.7]{./images/cerium/speblockedread.pdf}
   \end{center}
-  \caption{efgi}
-  \label{fig:efgi}
+  \caption{BlockedRead と Task を同じ thread で動かした場合}
+  \label{fig:spe_any_blockedread}
 \end{figure}
 
+Task が Blocked Read 間に割り込まれないようにするため、I/O 専用 thread である iO\_0 の設定を追加した。
+
+IO\_0 は SPE\_ANY とは別 thread の scheduler で動作するので、SPE\_ANY で動作している Task に割り込むことはない。
+しかし、読み込みの終了を通知し、次の read を行う時に他の Task がスレッドレベルで割り込んでしまう事がある。
+pthread\_getschedparam() で IO\_0 の priority の設定を行う必要がある(図:\ref{fig:iothread_blockedread})。
 \begin{figure}[htpb]
   \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/dfa.pdf}
+    \includegraphics[scale=0.7]{./images/cerium/iothread.pdf}
   \end{center}
-  \caption{dfa}
-  \label{fig:dfa}
+  \caption{IO Thread による BlockedRead}
+  \label{fig:iothread_blockedread}
 \end{figure}
 
-\begin{figure}[htpb]
-  \begin{center}
-    \includegraphics[scale=0.2]{images/implementation/nfa.pdf}
-  \end{center}
-  \caption{nfa}
-  \label{fig:nfa}
-\end{figure}
-
+IO\_0 で実行される Task は Blocked Read のみで、さらに IO\_0 の priority を高く設定することにより Blocked Read が他の Task に割り込まれることなく連続に実行される。
--- a/c4.tex	Wed Jan 20 16:16:46 2016 +0900
+++ b/c4.tex	Wed Jan 20 17:02:45 2016 +0900
@@ -1,3 +1,89 @@
 \chapter{Cerium による文字列処理の例題}
 \section{WordCount}
 \section{Boyer Moore Search}
+\section{正規表現}
+\subsection{正規表現木の生成}
+\subsection{正規表現木から NFA の生成}
+\subsection{Subset Construction による NFA から DFA の変換}
+\subsection{NFA から DFA の生成}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/CharClassMergePattern.pdf}
+  \end{center}
+  \caption{2つの Character Class を merge するときの全パターン}
+  \label{fig:CharClassMergePattern}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/ccinsert1.pdf}
+  \end{center}
+  \caption{Character Class を二分木で表示}
+  \label{fig:ccinsert1}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/ccinsert2.pdf}
+  \end{center}
+  \caption{ある Character Class の二分木に対して、新しい Character Class を insert}
+  \label{fig:ccinsert2}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/ccinsertresult.pdf}
+  \end{center}
+  \caption{insert 後の Character Class の二分木}
+  \label{fig:ccinsertresult}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/cfab.pdf}
+  \end{center}
+  \caption{cfab}
+  \label{fig:cfab}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/cfdg.pdf}
+  \end{center}
+  \caption{cfdg}
+  \label{fig:cfdg}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/cfdgab.pdf}
+  \end{center}
+  \caption{cfdgab}
+  \label{fig:cfdgab}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/efgi.pdf}
+  \end{center}
+  \caption{efgi}
+  \label{fig:efgi}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/dfa.pdf}
+  \end{center}
+  \caption{dfa}
+  \label{fig:dfa}
+\end{figure}
+
+\begin{figure}[htpb]
+  \begin{center}
+    \includegraphics[scale=0.2]{images/implementation/nfa.pdf}
+  \end{center}
+  \caption{nfa}
+  \label{fig:nfa}
+\end{figure}
+
--- a/c5.tex	Wed Jan 20 16:16:46 2016 +0900
+++ b/c5.tex	Wed Jan 20 17:02:45 2016 +0900
@@ -1,1 +1,5 @@
 \chapter{ベンチマーク}
+\section{I/O の測定}
+\section{Word Count}
+\section{Boyer Moore Search}
+\section{正規表現}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/CharClassMergePattern.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: CharClassMergePattern.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1422 1908
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/ccinsert1.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: ccinsert1.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1068 1050
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/ccinsert1.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/ccinsert2.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: ccinsert2.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1464 1116
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/ccinsert2.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/ccinsertresult.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: ccinsertresult.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 756 777
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/ccinsertresult.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/cfab.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: cfab.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 768 399
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/cfab.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/cfdg.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: cfdg.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 768 300
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/cfdg.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/cfdgab.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: cfdgab.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1278 396
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/cfdgab.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/dfa.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: dfa.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1614 900
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/dfa.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/efgi.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: efgi.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 888 360
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/efgi.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/implementation/nfa.bb	Wed Jan 20 17:02:45 2016 +0900
@@ -0,0 +1,5 @@
+%%Title: nfa.pdf
+%%Creator: extractbb 20150315
+%%BoundingBox: 0 0 1440 615
+%%CreationDate: Tue Jan 12 17:48:31 2016
+
Binary file images/implementation/nfa.pdf has changed
--- a/paper.mm	Wed Jan 20 16:16:46 2016 +0900
+++ b/paper.mm	Wed Jan 20 17:02:45 2016 +0900
@@ -14,7 +14,6 @@
 <node CREATED="1452656320699" ID="ID_1057473092" MODIFIED="1452656360793" TEXT="I/O &#x5c02;&#x7528; Thread"/>
 </node>
 <node CREATED="1452338017685" ID="ID_914746422" MODIFIED="1452655605596" POSITION="right" TEXT="&#x6587;&#x5b57;&#x5217;&#x51e6;&#x7406;&#x306e;&#x4f8b;&#x984c;">
-<node CREATED="1452652958297" ID="ID_1696941789" MODIFIED="1452656312633" TEXT="&#x4e26;&#x5217;&#x51e6;&#x7406;&#x6642;&#x306e;&#x30d5;&#x30a1;&#x30a4;&#x30eb;&#x5206;&#x5272;"/>
 <node CREATED="1452338366831" ID="ID_1893200252" MODIFIED="1452338371045" TEXT="WordCount"/>
 <node CREATED="1452338371523" ID="ID_869857867" MODIFIED="1452338386316" TEXT="Boyer Moore Search"/>
 <node CREATED="1452653003540" ID="ID_1626034226" MODIFIED="1452653009934" TEXT="&#x6b63;&#x898f;&#x8868;&#x73fe;">
@@ -25,7 +24,8 @@
 </node>
 <node CREATED="1452175345187" ID="ID_741844249" MODIFIED="1452175358409" POSITION="right" TEXT="&#x30d9;&#x30f3;&#x30c1;&#x30de;&#x30fc;&#x30af;">
 <node CREATED="1452653771882" ID="ID_1446317191" MODIFIED="1452653789483" TEXT="I/O &#x6e2c;&#x5b9a;"/>
-<node CREATED="1452653736019" ID="ID_484355456" MODIFIED="1452653745427" TEXT="WordCount"/>
+<node CREATED="1453276583223" ID="ID_626494195" MODIFIED="1453276610006" TEXT="mmap option"/>
+<node CREATED="1452653736019" ID="ID_484355456" MODIFIED="1453276667202" TEXT="Word Count"/>
 <node CREATED="1452653745896" ID="ID_1613665884" MODIFIED="1452653756123" TEXT="Boyer Moore Search"/>
 <node CREATED="1452653756338" ID="ID_50727493" MODIFIED="1452653764810" TEXT="&#x6b63;&#x898f;&#x8868;&#x73fe;"/>
 </node>