(58)【調査した分野】(Int.Cl.,DB名)
前記マルチコアCPUは、前記メモリ上に展開されるブロックの数を決定するための各ブロックのラベルの長さを、前記マルチコアCPUを構成するコア数をもとに計算することを特徴とする
請求項1に記載の文字列辞書の構築方法。
前記マルチコアCPUは、前記エントリ登録処理として、逐次的に読み込む前記登録元ブロックのグループと、同時並行に書き込む前記登録先ブロックのグループとをそれぞれグループ化し、前記登録元ブロックのグループ間では前記登録元ブロックの読み込み処理を並列に実行し、前記登録元ブロックのグループ内では前記登録元ブロックの読み込み処理を逐次的に実行することを特徴とする
請求項1に記載の文字列辞書の構築方法。
請求項1ないし請求項3のいずれか1項に記載の文字列辞書の構築方法により構築された前記文字列辞書を記憶する記憶手段と、制御手段とを有する検索装置により実行され、
前記制御手段は、
入力手段を介して、問合せ文字列の入力を受け付け、
前記文字列辞書に登録された前記文字列データにおける前記問合せ文字列の出現回数を検索し、
出力手段を介して、検索した出現回数を出力することを特徴とする
文字列辞書の検索方法。
【発明を実施するための形態】
【0014】
以下、本発明の一実施形態を、図面を参照して詳細に説明する。
【0015】
図1は、文字列検索システムを示す構成図である。文字列データ解析装置1は、通常の計算機の構成を有するサーバなどのコンピュータで実現される。
文字列データ解析装置1は、マルチコアCPU(Central Processing Unit)101と、メモリ102と、HDD103と、NIF104と、入力部105と、表示・出力部106とがバス107に接続された構成を備えている。
マルチコアCPU101は、複数のコアを備え並列計算を行うことができる中央処理部である。以下で説明する各種の処理は、マルチコアCPU101によるプログラムの実行を通じて実現される。
メモリ102は、プログラムや種々の作業用データなどが一時的に記憶される記憶部である。
HDD103は、文字列辞書112や種々の作業用データなどを記憶する記憶部として機能するハードディスクドライブである。HDD103に記憶される文字列辞書112は、文字列データ解析装置1に外部接続された記憶装置に記憶してもよいし、ネットワークを介して接続されたデータセンタなどに記憶してもよい。
【0016】
NIF104は、インターネットなどに接続するためのネットワークインタフェースである。文字列データ解析装置1は、NIF104が接続するLAN(Local Area Network)やインターネットなどを通じて外部装置と接続し、接続先にある文字列データ111にアクセスする。この文字列データ111は、文字列辞書112に登録されるデータである。
入力部105は、コマンド入力やパラメータ入力などを行うキーボードなどの入力手段である。入力部105は、問合せ文字列(query sequence)121の入力を受け付ける。
表示・出力部106は、操作のためのGUI(Graphical User Interface)や、解析結果などを表示する。表示・出力部106は、問合せ文字列121を検索キーとした文字列辞書112からの検索結果122として、問合せ文字列121の出現回数(hits)などを表示する。なお、出現回数とする代わりに、1回以上出現したか(出現あり)、0回の出現か(出現なし)という出現の有無情報としてもよい。
【0017】
図2は、
図1の文字列検索システムをDNA解析システムに適用した例である。なお、文字列データ111としてDNA配列データを用いれば、文字列検索システムをDNA配列データの検索システムに適用できる。また、文字列データ111としてアミノ酸配列(蛋白)データを用いれば、文字列検索システムを蛋白データの検索システムに適用できる。
ここで、患者501から採取したDNAサンプル502をDNAシーケンサ503で解析した結果のDNA配列データ504が、
図1の文字列データ111として用いられる。
文字列辞書112は、それぞれの患者501ごとに独立のDNA配列辞書505であり、文字列データ111をもとに構築される。
【0018】
まず、入力部105は、どの患者に対してどの遺伝子パネルを用いて変異解析を行うかという解析指示521を受け付ける。文字列データ解析装置1は、NIF104を介して、指示された遺伝子パネル511の情報をネットワークに接続されたデータベース512から取得する。遺伝子パネル511の情報には、各遺伝子の野生型配列Wと変異型配列M、各変異に関する付帯情報(その変異が原因となって生じる病状、効果的な治療法や薬剤など)が含まれる。
【0019】
次に、文字列データ解析装置1は、遺伝子パネル511内の各遺伝子に対して、その野生型配列と変異型配列とを問合せ文字列121として、DNA配列辞書505に問合せ文字列121の各配列が登録されているか否かを調べることによって、問合せ文字列121が患者501のDNAサンプル502に検出されるか否かを判定する。表示・出力部106は、この判定結果を解析結果522として表示または出力する。
【0020】
また、表示・出力部106は、解析結果522で検出された変異に対しては、遺伝子パネル511に含まれる付帯情報へのリンクをGUI(Graphic User Interface)などにより提供する。このリンクを辿ることにより、患者501の病状の進行を予測するための参照情報や、患者501に適した治療法や薬剤を選択するための参照情報が得られる。
【0021】
図3は、
図1の文字列検索システムの全体処理を示すフローチャートである。
S231として、マルチコアCPU101は、文字列データ111と正整数パラメータrを入力し、文字列辞書112を構築する(詳細は
図4)。
S232として、マルチコアCPU101は、問合せ文字列121を入力する。
S233として、マルチコアCPU101は、文字列辞書112を用いた公知の高速検索方法(非特許文献1)を利用して、文字列データ111内での問合せ文字列121の出現回数を調べる。
S234として、マルチコアCPU101は、S233の出現回数を検索結果122として出力または表示する。
【0022】
以下、文字列辞書112の構築処理(S231)で使用するデータ構造を定義する。
「ブロック」とは、構築中の文字列辞書112を分割したものであり、アルファベット文字または区切り文字を構成要素(エントリ)とするリストとして構成される。「空ブロック」とは、空のリストである。各ブロックは、共有メモリ上に配置される。
【0023】
「ラベル」とは、ブロックの識別子であり、未登録文字列の登録元や登録先となるブロックを特定するために使用される。ラベルの表記は、長さr(rを正整数パラメータ)のアルファベット文字列、または、長さが0以上r−1以下のアルファベット文字列の末尾に区切り記号$を付加したものである。ラベルwで始まる接尾辞のグループを、「wブロック」と表記する。
【0024】
「リンク」とは、ブロック内のエントリから、ブロック外の文字列へと接続するものである。1つのエントリ(リンク元)から、1つのリンク先文字列へとリンクが張られる。なお、ブロック内には、リンクがあるエントリも、リンクが無いエントリも存在しうる。なお、リンク先文字列は、以後新たにブロック内のエントリに登録されていくので、リンク先文字列は、現時点でのブロックへの「未登録文字列」とも言える。
【0025】
1つのブロックには、1つのラベルが付されている。例えば、
図8の$ブロック412とは、ラベルが「$」であるブロックである。このように、ブロックを矩形で示し、そのブロックの左側にラベルを示し、そのブロックの右側にリンク先文字列を示す。例えば、$ブロック412の1つめのエントリ「A」からは「AATT」(リンク先文字列413)がリンクされている。
【0026】
図4は、文字列辞書112の構築処理(S231)の詳細を示すフローチャートである。
S301として、マルチコアCPU101は、正整数パラメータrを入力し、長さr以下の各ラベルに対してメモリ102上に空ブロックを作成する。
S302として、マルチコアCPU101は、処理Sとして、新規の文字列データ111を1本ずつNIF104を介して入力し、その入力文字列の末尾文字を$ブロックに登録し、入力文字列の残りの文字列をその末尾文字にリンクする。入力文字列の末尾文字は、長さ0の接尾辞(空文字列ε)とも言える。
【0027】
S311として、マルチコアCPU101は、パラメータmを0にセットする。
S312として、マルチコアCPU101は、長さmの全てのアルファベット文字列wに対して、
図5の処理P(w)を並列に実行する。
S313として、マルチコアCPU101は、mの値を1つ増やす。
S314として、マルチコアCPU101は、m<rか否かを判定する。S314でYesならS312に戻り、NoならS321に進む。
【0028】
S321として、マルチコアCPU101は、ブロック内のエントリからリンクされた未登録文字列が残っているか否かを判定する。S321でYesならS322に、NoならS331に進む。
S322として、マルチコアCPU101は、長さr−1の全てのアルファベット文字列wに対して、
図6の処理Q(w)を並列に実行する。
S331として、マルチコアCPU101は、各ブロック内の登録されたエントリ文字を連結したブロックごとの連結文字列を作成する。
S332として、マルチコアCPU101は、S331の連結文字列をブロックのラベル順に1本に連結した出力文字列を作成し、その出力文字列を文字列辞書112としてHDD103に出力する。
【0029】
図5は、S312から呼び出される処理P(w)および処理I(c)の詳細を示すフローチャートである。
まず、処理P(w)について説明する。
S351として、マルチコアCPU101は、ポインタHをw$ブロック先頭にリセットする。
S352として、マルチコアCPU101は、全てのアルファベット文字cに対して処理I(c)を行う。
S361として、マルチコアCPU101は、ポインタHの参照先の登録文字をcとし、その登録文字cからリンクされた文字列(未登録文字列)をuとする。
【0030】
S362として、マルチコアCPU101は、S361の文字列uが存在するか否かを判定する。S362でYesならS363に、NoならS371に進む。
S363として、マルチコアCPU101は、uの末尾文字をdとし、uから末尾文字dを除いた残りの文字列をvとする。
S364として、マルチコアCPU101は、ポインタK(c)の位置にdを挿入し、その挿入したdからvへのリンクを張る。
S365として、マルチコアCPU101は、u及びそのcからuへのリンクを削除する。
S371として、マルチコアCPU101は、ポインタK(c)を次のエントリに1つ分進める。
S372として、マルチコアCPU101は、Hはw$ブロック末尾か否かを判定する。S372でYesなら処理P(w)を終了し、NoならS373に進む。
S373として、マルチコアCPU101は、ポインタHを次のエントリに1つ分進める。
【0031】
次に、処理I(c)について説明する。
S353として、マルチコアCPU101は、r<m−1か否かを判定する。S353でYesならS354に、NoならS355に進む。
S354として、マルチコアCPU101は、ポインタK(c)をcw$ブロック先頭にリセットする。
S355として、マルチコアCPU101は、ポインタK(c)をcwブロック先頭にリセットする。
【0032】
図6は、S322から呼び出される処理Q(w)の詳細を示すフローチャートである。
S201として、マルチコアCPU101は、変数aにアルファベットの最初の文字を代入する。例えば、アルファベット文字がAとTの2種類なら、変数aに「A」が代入される。
S202として、マルチコアCPU101は、ポインタK(a)を、処理P(w)がawブロック内に書き込んだ位置の直後の位置にリセットする。
S203として、マルチコアCPU101は、aをアルファベットの次の文字に更新する。例えば、アルファベット文字がAとTの2種類であり、現在の変数aに「A」が代入されているなら、次の「T」が変数aに代入される。
S204として、マルチコアCPU101は、S203で代入できるaが存在するか否かを判定する。S204でYesならS202に戻り、NoならS211に進む。
【0033】
S211として、マルチコアCPU101は、S201と同様に、再びaをアルファベットの最初の文字とする。
S212として、マルチコアCPU101は、
図7の処理R(w、a)を逐次的に実行する。
S213として、マルチコアCPU101は、S203と同様に、aをアルファベットの次の文字に更新する。
S214として、マルチコアCPU101は、S204と同様に、S213で代入できるaが存在するか否かを判定する。S214でYesならS212に戻り、Noなら処理Q(w)を終了する。
【0034】
図7は、S212から呼び出される処理R(w、a)の詳細を示すフローチャートである。
S220として、マルチコアCPU101は、ポインタHをwaブロック先頭にリセットする。
S221として、マルチコアCPU101は、ポインタHの参照先の登録文字をcとし、そのcからのリンク先文字列をuとする。
S221bとして、マルチコアCPU101は、uが存在するか否かを判定する。S221bでYesならS221cに、NoならS222に進む。
S221cとして、マルチコアCPU101は、uが空文字列εか否かを判定する。S221cでYesならS223に、NoならS224に進む。
【0035】
S222として、マルチコアCPU101は、ポインタK(c)を次のエントリに1つ分進める。
S223として、マルチコアCPU101は、ポインタK(c)の位置に区切り文字$を挿入する。
S224として、マルチコアCPU101は、uの末尾文字をdとし、uから末尾文字をdを除いた残りの文字列をvとする。
S225として、マルチコアCPU101は、ポインタK(c)の位置にdを挿入し、そのdからvへのリンクを張る。
S226として、マルチコアCPU101は、u及びcからuへのリンクを削除する。
S227として、マルチコアCPU101は、Hはwaブロック末尾か否かを判定する。S227でYesなら処理R(w、a)を終了し、NoならS228に進む。
S228として、マルチコアCPU101は、ポインタHを次のエントリに1つ分進める。
【0036】
以上、
図3〜
図7のフローチャートで説明した各処理について、
図8〜
図12の具体例で明らかにする。この具体例は、文字列データ111を構成するアルファベット文字はAとTの2種類で、r=2の場合である。
S301(空ブロック生成処理)では、$ブロック、A$ブロック、T$ブロック、AAブロック、ATブロック、TAブロック、TTブロックそれぞれの空ブロックが作成される。
【0037】
図8は、処理Sおよび処理P(w)の具体例を示す説明図である。
S302(処理S)では、枠内400に示す処理が行われる。つまり空ブロックであった$ブロック412が、処理Sにより以下の3エントリが登録される。なお、枠内411には3行の文字列データ111が読み込まれている。
・処理Sとして、枠内411の1行目「AATTA」を、$ブロック412の新たなAとそのリンク先のAATT(符号413)として登録する。
・処理Sとして、枠内411の2行目「ATAAT」を、$ブロック412の新たなTとそのリンク先のATAA(符号414)として登録する。
・処理Sとして、枠内411の3行目「TATAT」を、$ブロック412の新たなTとそのリンク先のTATA(符号415)として登録する。
【0038】
枠内420に示すように、S312から呼び出される1回目(m=0)の処理P(w)では、$ブロック412の3エントリからそれぞれ1文字ずつ別のブロックに登録される。なお、長さm=0の文字列wは空文字列εだけなので、m=0のときは処理P(ε)だけ実行される。
・処理P(ε)として、$ブロック412のAからリンクされるAATT(符号413)を、A$ブロック421の新たなTとそのリンク先のAATとして登録する。その登録後に$ブロック412のAを残しつつ、そのリンク先のAATT(符号413)とそのリンクを削除する。
・処理P(ε)として、$ブロック412のTからリンクされるATAA(符号414)を、T$ブロック422の新たなAとそのリンク先のATAとして登録する。その登録後に$ブロック412のTを残しつつ、そのリンク先のATAA(符号414)とそのリンクを削除する。
・処理P(ε)として、$ブロック412のTからリンクされるTATA(符号415)を、T$ブロック422の新たなAとそのリンク先のTATとして登録する。その登録後に$ブロック412のTを残しつつ、そのリンク先のTATA(符号415)とそのリンクを削除する。これにより、$ブロック412は、$ブロック481となる。
【0039】
なお、$ブロック412のAからリンクされるAATT(符号413)を、A$ブロック421の新たなTとそのリンク先のAATとして登録し、その登録後に$ブロック412のAを残しつつ、そのリンク先のAATT(符号413)とそのリンクを削除する例を、
図5の処理P(w)に対応付けて説明する。
上記の例での今回の登録対象となる未登録文字列は、「AATT(符号413)」である。この未登録文字列へのリンク元となるエントリが属する登録元ブロックは、「$ブロック412」である。
前記のフローチャートにおいて、処理P(w)では、登録元ブロックをw$ブロック(S351)とし、未登録文字列を文字列u(S361)とし、リンク元のエントリをポインタHが示す位置にある文字c(S361)として説明した。
【0040】
上記の例での未登録文字列の登録先ブロックは、「A$ブロック421」である。この登録先ブロック内に新たに登録されるエントリ「T」は、未登録文字列「AATT」の末尾文字である。エントリ「T」からのリンク先の文字列「AAT」は、未登録文字列「AATT」の末尾文字を除いた残りの文字である。
前記のフローチャートにおいて、処理P(w)では、登録先ブロックをcw$ブロック(S354)またはcwブロック(S355)とし、新たに登録されるエントリをポインタK(c)が示す位置に挿入される文字d(S363)とし、新たに登録されるリンク先の文字列を文字列v(S363)として説明した。
【0041】
枠内420に示すように、S312から呼び出される2回目(m=1)の処理P(w)では、長さmの文字列wとしては、AとTの2種類があるので、処理P(A)と処理P(T)とが並列に実行される。換言すると、処理P(A)が扱うブロックの集合と、処理P(T)が扱うブロックの集合とが互いに独立に実行可能な部分処理として2つのグループにグループ化されている。
【0042】
・処理P(A)として、A$ブロック421のTからリンクされるAATを、TAブロック433の新たなTとそのリンク先のAAとして登録する。その登録後にA$ブロック421のTを残しつつ、そのリンク先のAATとそのリンクを削除する。これにより、A$ブロック421は、エントリTだけが残るA$ブロック482になる。また、AAブロック431は、今回の処理P(A)としては登録先ブロックには該当しないが、次の処理(枠内435)で扱うので、ここではわかりやすくするために記載した。このように登録先ブロックには該当しないブロックも適宜図示することにする。
【0043】
・処理P(T)として、T$ブロック422のAからリンクされるATAを、ATブロック432の新たなAとそのリンク先のATとして登録する。その登録後にT$ブロック422のAを残しつつ、そのリンク先のATAとそのリンクを削除する。
・処理P(T)として、T$ブロック422のAからリンクされるTATを、ATブロック432の新たなTとそのリンク先のTAとして登録する。その登録後にT$ブロック422のAを残しつつ、そのリンク先のTATとそのリンクを削除する。
その後、m=r=2となり、S314でNoとなるので、3回目(m=2)の処理P(w)は実行されない。
そして、TAブロック433の未登録文字列「AA」などが残っているので、S321でYesとなり、S322が実行される。
【0044】
図9は、
図8の後に実行される、処理Q(w)および処理R(w、a)の具体例を示す説明図である。
枠内440に示すように、S322から呼び出される1回目の処理Q(w)では、長さr−1の全てのアルファベット文字列はAとTの2通りがあるので、処理Q(A)と処理Q(T)とが並列に実行される。
【0045】
処理Q(A)内のS212では、文字a=A、Tに対して、処理R(A、A)と処理R(A、T)とがこの順序で逐次実行される。
処理Q(A)の入力グループ(枠内435)と、処理Q(A)の出力グループ(枠内437)とを示す。
処理Q(A)の入力グループ側では逐次的に参照すべきブロックを纏めてグループ化されている。処理Q(A)の出力グループ側では同時並行に書き込むべきブロックを纏めてグループ化されている。
【0046】
・処理Q(A)の処理R(A、A)として、AAブロック431にはリンクを有するエントリが無いので、処理をスキップする。
・処理Q(A)の処理R(A、T)として、ATブロック432のAからリンクされるATを、AAブロック441の新たなTとそのリンク先のAとして登録する。その登録後にATブロック432のAを残しつつ、そのリンク先のATとそのリンクを削除する。
・処理Q(A)の処理R(A、T)として、ATブロック432のTからリンクされるTAを、TAブロック443の新たなAとそのリンク先のTとして登録する。その登録後にATブロック432のTを残しつつ、そのリンク先のTAとそのリンクを削除する。
【0047】
なお、ATブロック432のAからリンクされるATを、AAブロック441の新たなTとそのリンク先のAとして登録し、その登録後にATブロック432のAを残しつつ、そのリンク先のATとそのリンクを削除する例を、
図7のR(w、a)に対応付けて説明する。
上記の例での今回の登録対象となる未登録文字列は、「AT」である。この未登録文字列へのリンク元となるエントリが属する登録元ブロックは、「ATブロック432」である。
前記のフローチャートにおいて、R(w、a)では、登録元ブロックをwaブロック(S220)とし、未登録文字列を文字列u(S221)とし、リンク元のエントリをポインタHが示す位置にある文字c(S221)として説明した。
【0048】
上記の例での未登録文字列の登録先ブロックは、「AAブロック441」である。この登録先ブロック内に新たに登録されるエントリ「T」は、未登録文字列「AT」の末尾文字である。エントリ「T」からのリンク先の文字列「A」は、未登録文字列「AT」の末尾文字を除いた残りの文字である。
前記のフローチャートにおいて、R(w、a)では、登録先ブロックをawブロック(S202)とし、新たに登録されるエントリをポインタK(c)が示す位置に挿入される文字d(S224)とし、新たに登録されるリンク先の文字列を文字列v(S224)として説明した。つまり、R(w、a)の登録先ブロックは、cwブロックからなるグループ(cは任意の文字)であって、全てのaについて共通であり、また、S202でリセットされた同じポインタK(c)を順に引き継いで利用する。その結果、各cwブロックへの書き込みは辞書順に正しく行われる。
【0049】
処理Q(T)内のS212では、文字a=A、Tに対して、処理R(T、A)と処理R(T、T)とがこの順序で逐次実行される。
処理Q(T)の入力グループ(枠内436)と、処理Q(T)の出力グループ(枠内438)とを示す。
・処理Q(T)の処理R(T、A)として、TAブロック433のTからリンクされるAAを、TTブロック444の新たなAとそのリンク先のAとして登録する。その登録後にTAブロック433のTを残しつつ、そのリンク先のAAとそのリンクを削除する。
・処理Q(T)の処理R(T、T)として、TTブロック434にはリンクを有するエントリが無いので、処理をスキップする。
そして、AAブロック441の未登録文字列「A」などが残っているので、S321でYesとなり、S322が実行される。
【0050】
図10は、
図9の後に実行される、処理Q(w)および処理R(w、a)の具体例を示す説明図である。
枠内450に示すように、2回目の処理Q(w)でも、処理Q(A)と処理Q(T)とが並列に実行される。
処理Q(A)の入力グループ(枠内445)と、処理Q(A)の出力グループ(枠内447)とを示す。
・処理Q(A)の処理R(A、A)として、AAブロック441のTからリンクされるAを、TAブロック453の新たなAとそのリンク先のεとして登録する。この登録のための挿入位置439は、ポインタK(T)により指示される。その登録後にAAブロック441のTを残しつつ、そのリンク先のAとそのリンクを削除する。
・処理Q(A)の処理R(A、T)として、ATブロック442にはリンクを有するエントリが無いので、処理をスキップする。つまり、AAブロック451内へのポインタK(A)と、TAブロック453内へのポインタK(T)とを先に進める。
【0051】
処理Q(T)の入力グループ(枠内446)と、処理Q(T)の出力グループ(枠内448)とを示す。
・処理Q(T)の処理R(T、A)として、TAブロック443のAからリンクされるTを、ATブロック452の新たなTとそのリンク先のεとして登録する。この登録のための挿入位置459は、ポインタK(A)により指示される。その登録後にTAブロック443のAを残しつつ、そのリンク先のTとそのリンクを削除する。
・処理Q(T)の処理R(T、T)として、TTブロック444のAからリンクされるAを、ATブロック452の新たなAとそのリンク先のεとして登録する。その登録後にTTブロック444のAを残しつつ、そのリンク先のAとそのリンクを削除する。
そして、TAブロック453の未登録文字列「ε」などが残っているので、S321でYesとなり、S322が実行される。
【0052】
図11は、
図10の後に実行される、処理Q(w)および処理R(w、a)の具体例を示す説明図である。
枠内460に示すように、3回目の処理Q(w)でも、処理Q(A)と処理Q(T)とが並列に実行される。
処理Q(A)の入力グループ(枠内455)と、処理Q(A)の出力グループ(枠内457)とを示す。
・処理Q(A)の処理R(A、A)として、AAブロック451にはリンクを有するエントリが無いので、処理をスキップする。つまり、AAブロック461内へのポインタK(A)とTAブロック463内へのポインタK(T)とを先に進める。
・処理Q(A)の処理R(A、T)として、ATブロック452のTからリンクされるεを、TAブロック463の新たな$として登録する。その登録後にATブロック452のTを残しつつ、そのリンク先のεとそのリンクを削除する。
・処理Q(A)の処理R(A、T)として、ATブロック452のAからリンクされるεを、AAブロック461の新たな$として登録する。その登録後にATブロック452のAを残しつつ、そのリンク先のεとそのリンクを削除する。
【0053】
処理Q(T)の入力グループ(枠内456)と、処理Q(T)の出力グループ(枠内458)とを示す。
・処理Q(T)の処理R(T、A)として、TAブロック453のAからリンクされるεを、ATブロック462の新たな$として登録する。その登録後にTAブロック453のAを残しつつ、そのリンク先のεとそのリンクを削除する。
・処理Q(T)の処理R(T、T)として、TTブロック454にはリンクを有するエントリが無いので、処理をスキップする。つまり、ATブロック462内へのポインタK(A)と、TTブロック464内へのポインタK(T)とを先に進める。
これにより、未登録文字列がすべて解消されたので、S321でNoとなり、S331が実行される。
【0054】
図12は、
図11の後に実行される、文字列辞書112の出力処理を示す説明図である。
S331(ブロックごとの連結文字列の作成処理)では、ラベル順にソートした各ブロック($ブロック481、A$ブロック482、AAブロック461、ATブロック462、T$ブロック483、TAブロック463、TTブロック464)に登録されたエントリを、図示した矢印の順に文字列471〜477として抽出する。
S332(文字列辞書112の出力処理)では、枠内490に示すように、文字列471〜477を順に1本に連結した出力文字列を文字列辞書112として作成する。
【0055】
以上説明した本実施形態では、文字列辞書112の構築処理(S231)として、文字列データ解析装置1は、NIF104を介して入力して、文字列データ111から文字列を入力する。文字列データ解析装置1は、入力された文字列を未登録文字列とし、その全ての接尾辞を短いものから順に、処理P(w)、処理Q(w)、処理R(w、a)で示した各手順に従って、空ブロックに順次登録していく。
ここで、接尾辞をブロックに登録するとは、接尾辞に先行する文字(但し、接尾辞が文字列全体に一致する場合は区切り文字$)をブロックに登録することである。ブロックに登録された各文字に対して、それに後続する接尾辞を復元する効率的な計算方法は公知である(非特許文献1)。また、未登録文字列から接尾辞を除いた残りの文字列を、今回登録した接尾辞にリンクして一時的に保持する。
【0056】
全ての文字列の全ての接尾辞に対してブロックへの登録処理が完了した後、
図12で示した手順に従って、全てのブロックに対して、そこに登録されている文字を連結した文字列を作成し、さらに、それらの文字列をブロックのラベルの辞書式順番に従って連結した文字列辞書112を、BW変換としてHDD103内に出力する。
【0057】
なお、S301において、既に作成済みの文字列辞書112がHDD103内(または、ネットワークの接続先からNIF104を介して取り込んでHDD103内)にある場合は、空ブロックの代わりに、文字列辞書112を作成したときのブロックの情報をメモリ上にロードしてもよい。この場合、作成済みの文字列辞書112に対して、NIF104を介して新たに入力した文字列データ111を、追加登録することができる。
【0058】
また、S364,S223,S225で説明したように、メモリ102上のブロックに毎回新たなエントリが追加登録される際、リストであるブロックへの挿入処理が必要となる。そこで、ブロックのデータ構造としては、(非特許文献4に記載された平衡木のような)動的構造を採用してもよいし、あるいは、(特許文献1に記載されているようにリストのコピーを毎回再構築するような)静的構造を採用してもよい。
【0059】
以下では、本実施形態の文字列辞書112の構築処理について、その並列計算における並列度や待ち合わせなどについて、補足説明する。
前記の例では、アルファベット文字をAとTの2種類としたが、アルファベット文字の種類をh種類(文字a
1、a
2、…、a
h)に拡張する。
【0060】
まず、処理P(w)の並列度について説明する。
処理P(w)が読み込む登録元ブロックはw$ブロックであり、各mに対して、文字列wが異なれば相異なる。
処理P(w)が書き出す登録先ブロックは、mがr−1未満ならば、a
1w$ブロック、a
2w$ブロック、…、a
hw$ブロックであり、m=r−1ならば、a
1wブロック、a
2wブロック、…、a
hwブロックである。登録先ブロックでは、いずれの場合も、文字列wが異なれば互いに排反である。従って、各mに対して、処理P(w)は互いに干渉することなく、独立に並列に実行可能となる。
【0061】
次に、処理Q(w)の並列度について説明する。
処理Q(w)が読み込む登録元ブロックはwa
1ブロック、wa
2ブロック、…、wa
hブロックであり、文字列wが異なれば互いに排反である。
処理Q(w)が書き出す登録先ブロックは、a
1wブロック、a
2wブロック、…、a
hwブロックであり、これらも、文字列wが異なれば互いに排反である。従って、処理Q(w)は、互いに干渉することなく、独立に並列に実行可能となる。
【0062】
そして、処理R(w、a)の並列度について説明する。
処理R(w、a
1)、R(w、a
2)、…、R(w、a
h)での登録先ブロックはh個あり、それらは、a
1wブロック、a
2wブロック、…、a
hwブロックで共通である。これらの登録処理はアルファベット順に逐次的に実行されるため、各ブロックへの登録処理もアルファベット順に正しく行われる。
このように、順番を守って逐次実行しなければならない処理R(w、a)の数は、アルファベットのサイズに等しく、パラメータrには依存せず一定である。従って、パラメータrを増やして、並列処理としての粒度を細かくしても、逐次実行の待ち合わせの長さは一定に保たれ、待ち合わせによるCPU稼働率低下を生じることはない。
【0063】
以上により、互いに独立に行うことができる部分処理に細分化され、処理R(w、a
1)、R(w、a
2)、…、R(w、a
h)を逐次実行する以外に待ち合わせの必要はなく、待ち合わせによるプロセッサ稼働率の低下を回避することができる。
【0064】
ここで、マルチコアCPU101は、正整数パラメータrの値を入力させてもよいし、マルチコアCPU101のCPUコア数をもとに自動計算してもよい。
S301で説明したように、r=2でアルファベット文字がAとTの2種類のときには、7種類のブロック($ブロック、A$ブロック、T$ブロック、AAブロック、ATブロック、TAブロック、TTブロック)を使用した。つまり、計算式「7=2の3乗−1」を一般化した計算式「(ブロック数)=((hの(r+1)乗−1)/(h−1)」により、ブロック数を求めることができる。そして、マルチコアCPU101は、例えば、(CPUコア数)×K=(ブロック数)、(Kは例えば数十倍を示す10〜90の定数)となるように、CPUコア数からブロック数を求め、そのブロック数を前記の一般化した計算式に代入することにより、パラメータrを自動計算することができる。
【0065】
正整数パラメータrを増やすとブロック数は指数関数的に増大するので、ブロック数がCPUコア数の数十倍程度となるようにrの値を定めることができる。このとき、マルチ・スレッドによる動的負荷分散を行えば、処理P(w)や処理Q(w)の計算時間のバラツキが生じても、コア間の計算負荷を均等化でき、全てのコアを有効に使った効率的な高速化が可能となる。
例えば、独立に並列実行可能な処理Q(w)の数は、長さr−1の文字列wの数だけある。この数は、アルファベットのサイズをhとすると、hのr−1乗に等しい。従って、DNA配列データのようにh=4の場合であっても、処理Q(w)の数が利用可能なCPUコア数の数十倍程度になるようにrを選ぶことができる。
これにより、CPUコア数の数十倍程度の部分処理に細分化する方法を提供し、また、部分処理どうしの待ち合わせによるプロセッサ稼働率の低下を回避する方法を提供することができる。
【0066】
なお、本発明は前記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、前記した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。
また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。
また、各実施例の構成の一部について、他の構成の追加・削除・置換をすることが可能である。また、上記の各構成、機能、処理部、処理手段などは、それらの一部または全部を、例えば集積回路で設計するなどによりハードウェアで実現してもよい。
また、前記の各構成、機能などは、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。
【0067】
各機能を実現するプログラム、テーブル、ファイルなどの情報は、メモリや、ハードディスク、SSD(Solid State Drive)などの記録装置、または、IC(Integrated Circuit)カード、SDカード、DVD(Digital Versatile Disc)などの記録媒体に置くことができる。
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際にはほとんど全ての構成が相互に接続されていると考えてもよい。