(57)【特許請求の範囲】
【請求項１】
複数のＣＰＵコアで構成されるマルチコアＣＰＵと、メモリとを備える文字列データ解析装置により実行され、
前記メモリ上に展開される文字列辞書を分割した複数のブロックには、文字列データを構成するアルファベットおよび区切り文字が１文字以上で構成されるラベルとして、各ブロックにそれぞれ異なるラベルが付されており、
前記マルチコアＣＰＵは、
入力される前記文字列データそれぞれについて、区切り文字のラベルが付されているブロックに対して、前記文字列データの末尾文字をブロックのエントリとして登録し、その末尾文字から前記文字列データの残りの文字列を未登録文字列として対応付け、
各ブロックのうちのエントリに前記未登録文字列が対応付けられている登録元ブロックを読み込み、前記登録元ブロックのラベルおよびエントリから特定される登録先ブロックに対して、前記登録元ブロックの前記未登録文字列の末尾文字を前記登録先ブロックに新たなエントリとして登録し、その新たなエントリから前記未登録文字列の残りの文字列を新たな未登録文字列として対応付けるエントリ登録処理について、互いに独立に実行可能なブロックのグループについて並列に実行し、
各ブロックの前記未登録文字列が無くなった状態で、各ブロックのエントリに登録されている文字列について、ブロックのラベルが示すアルファベットおよび区切り文字の順序で連結した文字列を前記文字列データが登録済みの前記文字列辞書のＢＷ（Burrows-Wheeler）変換データとして出力することを特徴とする
文字列辞書の構築方法。
【請求項２】
前記マルチコアＣＰＵは、前記メモリ上に展開されるブロックの数を決定するための各ブロックのラベルの長さを、前記マルチコアＣＰＵを構成するコア数をもとに計算することを特徴とする
請求項１に記載の文字列辞書の構築方法。
【請求項３】
前記マルチコアＣＰＵは、前記エントリ登録処理として、逐次的に読み込む前記登録元ブロックのグループと、同時並行に書き込む前記登録先ブロックのグループとをそれぞれグループ化し、前記登録元ブロックのグループ間では前記登録元ブロックの読み込み処理を並列に実行し、前記登録元ブロックのグループ内では前記登録元ブロックの読み込み処理を逐次的に実行することを特徴とする
請求項１に記載の文字列辞書の構築方法。
【請求項４】
請求項１ないし請求項３のいずれか１項に記載の文字列辞書の構築方法により構築された前記文字列辞書を記憶する記憶手段と、制御手段とを有する検索装置により実行され、
前記制御手段は、
入力手段を介して、問合せ文字列の入力を受け付け、
前記文字列辞書に登録された前記文字列データにおける前記問合せ文字列の出現回数を検索し、
出力手段を介して、検索した出現回数を出力することを特徴とする
文字列辞書の検索方法。
【請求項５】
前記文字列辞書は、前記文字列データとして患者ごとのＤＮＡサンプルをＤＮＡシーケンサで解析した結果のＤＮＡ配列データが登録されるＤＮＡ配列辞書であり、
前記入力手段は、あらかじめ遺伝子パネルとして設定されている変異ありのＤＮＡ配列データを、前記問合せ文字列として受け付け、
前記制御手段は、前記文字列辞書に登録された前記文字列データにおける前記問合せ文字列の出現回数を検索することで、前記患者のＤＮＡ配列データに変異が発生しているか否かを解析し、
前記出力手段を介して、出現した変異ありのＤＮＡ配列データと、そのＤＮＡ配列データに対して前記遺伝子パネルで対応づけられている付帯情報とを出力することを特徴とする
請求項４に記載の文字列辞書の検索方法。
【請求項６】
請求項１に記載の文字列辞書の構築方法を実行する前記文字列データ解析装置と、
請求項５に記載の文字列辞書の検索方法を実行する前記検索装置と、
請求項５に記載の文字列辞書の検索方法において前記患者ごとのＤＮＡサンプルを解析し、その解析結果をＤＮＡ配列データとして出力する前記ＤＮＡシーケンサとを含めて構成されることを特徴とする
文字列辞書の処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、文字列辞書の構築方法、文字列辞書の検索方法、および、文字列辞書の処理システムに関する。
【背景技術】
【０００２】
ＤＮＡ（DeoxyriboNucleic Acid）シーケンシング技術の進歩により、ＤＮＡシーケンサが出力するＤＮＡ配列データの量は急速に増大しつつある。そのため、大量に得られたＤＮＡ配列データの中に有害な変異配列が含まれていないかを調べる変異解析など、データ解析に要する計算コストも増大しつつある。
データ解析を効率化するためには、計測された順に出力されるＤＮＡ配列データ（文字列データ）を、アルファベット順（辞書式順序）にソートすることが有効である。ソートされたデータに対しては、高速な検索が可能になるからである。特に、ＤＮＡ配列データに適した方法として、ＢＷ（Burrows-Wheeler）変換（または、ＦＭインデクス）を用いる方法が知られている（非特許文献１）。【０００３】
ＤＮＡ配列データをＢＷ変換したものはＤＮＡと区切り文字（＄）を要素とする１本の配列として表現され、その各要素は、元のＤＮＡ配列データ内にある全ての配列の全ての接尾辞をアルファベット順にソートして列挙したリストの各要素と一対一に対応する。さらに、ＢＷ変換した結果を、全ての接尾辞をアルファベット順にソートした辞書として利用することができる効率的な方法が知られている（非特許文献１）。そこで、ＢＷ変換結果を文字列辞書ともよぶ。【０００４】
ＤＮＡ配列データのサイズは大きいため、文字列辞書の構築にも大きな計算コストがかかる。文字列辞書を高速に構築する方法は知られている（特許文献１、非特許文献２、非特許文献３）。さらに高速化するため、文字列辞書の構築を、塩基の種類（アルファベット文字）Ａ、Ｃ、Ｇ、Ｔごとに並列化する方法も用いられている（非特許文献４）。その結果、塩基の種類数（アルファベット・サイズ）にほぼ等しい並列度が得られ、約４倍の高速化率が得られるが、それ以上の並列度は得られていない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第８７９８９３６号明細書
【非特許文献】
【０００６】
【非特許文献１】Ferragina P, Manzini G. Proceedings of the 41st Symposium on Foundations of Computer Science (FOCS 2000). Los Alamitos, CA, USA: IEEE Computer Society; 2000. Opportunistic data structures with applications; p. 390-398.
【非特許文献２】Lippert, Ross A., Clark M. Mobarry, and Brian P. Walenz. "A space-efficient construction of the Burrows-Wheeler transform for genomic data." Journal of Computational Biology 12.7 (2005): 943-951.
【非特許文献３】Ferragina P, Gagie T, Manzini G. “Lightweight Data Indexing and Compression in External Memory.” LATIN 2010: Theoretical Informatics. Volume 6034 of the series Lecture Notes in Computer Science, Springer, pp 697-710.
【非特許文献４】Li, Heng. "Fast construction of FM-index for long sequence reads." Bioinformatics (2014): btu541.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
一方、近年の計算機では、複数のマルチコア化されたＣＰＵを用いたマルチ・スレッド処理により、数十倍の並列度で数十倍の高速化が可能な場合が多い。しかし、大量の文字列データに対する文字列辞書の構築を文字種ごとに並列化する方法（非特許文献４）では、並列度はアルファベットのサイズ程度（例えば、ＤＮＡ配列データの場合であれば、塩基は４種類なので、４倍程度）に抑えられる。従って、数十以上のＣＰＵコアを備えた計算機では、全てのコアを有効に使った並列計算による高速化を行うことはできない。【０００８】
よって、並列度をさらに向上させるような並列計算の手法を検討する。一般に、処理を高速化するために、全体処理を部分処理に分割して並列に実行することはよく行われている。このとき、部分処理の間では、互いの計算結果を参照し合ったり、共有メモリや入出力デバイスなどにアクセスしたりするため、待ち合わせ（同期）が必要となる場合が多い。このような待ち合わせが頻繁に生じると、プロセッサの稼働率が低下し、処理の高速化が妨げられる原因となる。【０００９】
また、一般に、部分処理に要する計算時間にはバラツキがあり、部分処理の数がＣＰＵコア数程度であれば、ＣＰＵコアの計算負荷にはアンバランスが生じ、全てのＣＰＵコアを有効に利用することが難しくなる。そこで、全てのＣＰＵコアへの計算負荷分散を均等化して、効率的な高速化を行うためには、コア数よりも充分に多数の部分処理に細分化することが必要になる。それができれば、マルチ・スレッドによる動的負荷分散により、コア間の計算負荷を均等化でき、全てのコアを有効に使った効率的な並列化による高速化が可能となる。【００１０】
そこで、本発明は、文字列データを登録する文字列辞書の構築処理において、ＣＰＵコアの数を有効に利用した高速化が行えるような並列化の手法を提供することを、主な目的とする。
【課題を解決するための手段】
【００１１】
前記課題を解決するために、本発明の文字列辞書の構築方法は、以下の各処理を実行する方法である。
つまり、本発明は、複数のＣＰＵコアで構成されるマルチコアＣＰＵと、メモリとを備える文字列データ解析装置により実行され、
前記メモリ上に展開される文字列辞書を分割した複数のブロックには、文字列データを構成するアルファベットおよび区切り文字が１文字以上で構成されるラベルとして、各ブロックにそれぞれ異なるラベルが付されており、
前記マルチコアＣＰＵが、
入力される前記文字列データそれぞれについて、区切り文字のラベルが付されているブロックに対して、前記文字列データの末尾文字をブロックのエントリとして登録し、その末尾文字から前記文字列データの残りの文字列を未登録文字列として対応付け、
各ブロックのうちのエントリに前記未登録文字列が対応付けられている登録元ブロックを読み込み、前記登録元ブロックのラベルおよびエントリから特定される登録先ブロックに対して、前記登録元ブロックの前記未登録文字列の末尾文字を前記登録先ブロックに新たなエントリとして登録し、その新たなエントリから前記未登録文字列の残りの文字列を新たな未登録文字列として対応付けるエントリ登録処理について、互いに独立に実行可能なブロックのグループについて並列に実行し、
各ブロックの前記未登録文字列が無くなった状態で、各ブロックのエントリに登録されている文字列について、ブロックのラベルが示すアルファベットおよび区切り文字の順序で連結した文字列を前記文字列データが登録済みの前記文字列辞書のＢＷ（Burrows-Wheeler）変換データとして出力することを特徴とする。
その他の手段は、後記する。
【発明の効果】
【００１２】
本発明によれば、文字列データを登録する文字列辞書の構築処理において、ＣＰＵコアの数を有効に利用した高速化が行えるような並列化の手法を提供することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の一実施形態に関する文字列検索システムを示す構成図である。
【図２】本発明の一実施形態に関する図１の文字列検索システムをＤＮＡ解析システムに適用した例である。
【図３】本発明の一実施形態に関する図１の文字列検索システムの全体処理を示すフローチャートである。
【図４】本発明の一実施形態に関する文字列辞書の構築処理の詳細を示すフローチャートである。
【図５】本発明の一実施形態に関する処理Ｐ（ｗ）および処理Ｉ（ｃ）の詳細を示すフローチャートである。
【図６】本発明の一実施形態に関する処理Ｑ（ｗ）の詳細を示すフローチャートである。
【図７】本発明の一実施形態に関する処理Ｒ（ｗ、ａ）の詳細を示すフローチャートである。
【図８】本発明の一実施形態に関する処理Ｓおよび処理Ｐ（ｗ）の具体例を示す説明図である。
【図９】本発明の一実施形態に関する図８の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
【図１０】本発明の一実施形態に関する図９の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
【図１１】本発明の一実施形態に関する図１０の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
【図１２】本発明の一実施形態に関する図１１の後に実行される、文字列辞書の出力処理を示す説明図である。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態を、図面を参照して詳細に説明する。
【００１５】
図１は、文字列検索システムを示す構成図である。文字列データ解析装置１は、通常の計算機の構成を有するサーバなどのコンピュータで実現される。
文字列データ解析装置１は、マルチコアＣＰＵ（Central Processing Unit）１０１と、メモリ１０２と、ＨＤＤ１０３と、ＮＩＦ１０４と、入力部１０５と、表示・出力部１０６とがバス１０７に接続された構成を備えている。
マルチコアＣＰＵ１０１は、複数のコアを備え並列計算を行うことができる中央処理部である。以下で説明する各種の処理は、マルチコアＣＰＵ１０１によるプログラムの実行を通じて実現される。
メモリ１０２は、プログラムや種々の作業用データなどが一時的に記憶される記憶部である。
ＨＤＤ１０３は、文字列辞書１１２や種々の作業用データなどを記憶する記憶部として機能するハードディスクドライブである。ＨＤＤ１０３に記憶される文字列辞書１１２は、文字列データ解析装置１に外部接続された記憶装置に記憶してもよいし、ネットワークを介して接続されたデータセンタなどに記憶してもよい。
【００１６】
ＮＩＦ１０４は、インターネットなどに接続するためのネットワークインタフェースである。文字列データ解析装置１は、ＮＩＦ１０４が接続するＬＡＮ（Local Area Network）やインターネットなどを通じて外部装置と接続し、接続先にある文字列データ１１１にアクセスする。この文字列データ１１１は、文字列辞書１１２に登録されるデータである。
入力部１０５は、コマンド入力やパラメータ入力などを行うキーボードなどの入力手段である。入力部１０５は、問合せ文字列（query sequence）１２１の入力を受け付ける。
表示・出力部１０６は、操作のためのＧＵＩ（Graphical User Interface）や、解析結果などを表示する。表示・出力部１０６は、問合せ文字列１２１を検索キーとした文字列辞書１１２からの検索結果１２２として、問合せ文字列１２１の出現回数（hits）などを表示する。なお、出現回数とする代わりに、１回以上出現したか（出現あり）、０回の出現か（出現なし）という出現の有無情報としてもよい。
【００１７】
図２は、図１の文字列検索システムをＤＮＡ解析システムに適用した例である。なお、文字列データ１１１としてＤＮＡ配列データを用いれば、文字列検索システムをＤＮＡ配列データの検索システムに適用できる。また、文字列データ１１１としてアミノ酸配列（蛋白）データを用いれば、文字列検索システムを蛋白データの検索システムに適用できる。
ここで、患者５０１から採取したＤＮＡサンプル５０２をＤＮＡシーケンサ５０３で解析した結果のＤＮＡ配列データ５０４が、図１の文字列データ１１１として用いられる。
文字列辞書１１２は、それぞれの患者５０１ごとに独立のＤＮＡ配列辞書５０５であり、文字列データ１１１をもとに構築される。
【００１８】
まず、入力部１０５は、どの患者に対してどの遺伝子パネルを用いて変異解析を行うかという解析指示５２１を受け付ける。文字列データ解析装置１は、ＮＩＦ１０４を介して、指示された遺伝子パネル５１１の情報をネットワークに接続されたデータベース５１２から取得する。遺伝子パネル５１１の情報には、各遺伝子の野生型配列Ｗと変異型配列Ｍ、各変異に関する付帯情報（その変異が原因となって生じる病状、効果的な治療法や薬剤など）が含まれる。
【００１９】
次に、文字列データ解析装置１は、遺伝子パネル５１１内の各遺伝子に対して、その野生型配列と変異型配列とを問合せ文字列１２１として、ＤＮＡ配列辞書５０５に問合せ文字列１２１の各配列が登録されているか否かを調べることによって、問合せ文字列１２１が患者５０１のＤＮＡサンプル５０２に検出されるか否かを判定する。表示・出力部１０６は、この判定結果を解析結果５２２として表示または出力する。
【００２０】
また、表示・出力部１０６は、解析結果５２２で検出された変異に対しては、遺伝子パネル５１１に含まれる付帯情報へのリンクをＧＵＩ（Graphic User Interface）などにより提供する。このリンクを辿ることにより、患者５０１の病状の進行を予測するための参照情報や、患者５０１に適した治療法や薬剤を選択するための参照情報が得られる。
【００２１】
図３は、図１の文字列検索システムの全体処理を示すフローチャートである。
Ｓ２３１として、マルチコアＣＰＵ１０１は、文字列データ１１１と正整数パラメータｒを入力し、文字列辞書１１２を構築する（詳細は図４）。
Ｓ２３２として、マルチコアＣＰＵ１０１は、問合せ文字列１２１を入力する。
Ｓ２３３として、マルチコアＣＰＵ１０１は、文字列辞書１１２を用いた公知の高速検索方法（非特許文献１）を利用して、文字列データ１１１内での問合せ文字列１２１の出現回数を調べる。
Ｓ２３４として、マルチコアＣＰＵ１０１は、Ｓ２３３の出現回数を検索結果１２２として出力または表示する。
【００２２】
以下、文字列辞書１１２の構築処理（Ｓ２３１）で使用するデータ構造を定義する。
「ブロック」とは、構築中の文字列辞書１１２を分割したものであり、アルファベット文字または区切り文字を構成要素（エントリ）とするリストとして構成される。「空ブロック」とは、空のリストである。各ブロックは、共有メモリ上に配置される。
【００２３】
「ラベル」とは、ブロックの識別子であり、未登録文字列の登録元や登録先となるブロックを特定するために使用される。ラベルの表記は、長さｒ（ｒを正整数パラメータ）のアルファベット文字列、または、長さが０以上ｒ−１以下のアルファベット文字列の末尾に区切り記号＄を付加したものである。ラベルｗで始まる接尾辞のグループを、「ｗブロック」と表記する。
【００２４】
「リンク」とは、ブロック内のエントリから、ブロック外の文字列へと接続するものである。１つのエントリ（リンク元）から、１つのリンク先文字列へとリンクが張られる。なお、ブロック内には、リンクがあるエントリも、リンクが無いエントリも存在しうる。なお、リンク先文字列は、以後新たにブロック内のエントリに登録されていくので、リンク先文字列は、現時点でのブロックへの「未登録文字列」とも言える。
【００２５】
１つのブロックには、１つのラベルが付されている。例えば、図８の＄ブロック４１２とは、ラベルが「＄」であるブロックである。このように、ブロックを矩形で示し、そのブロックの左側にラベルを示し、そのブロックの右側にリンク先文字列を示す。例えば、＄ブロック４１２の１つめのエントリ「Ａ」からは「ＡＡＴＴ」（リンク先文字列４１３）がリンクされている。
【００２６】
図４は、文字列辞書１１２の構築処理（Ｓ２３１）の詳細を示すフローチャートである。
Ｓ３０１として、マルチコアＣＰＵ１０１は、正整数パラメータｒを入力し、長さｒ以下の各ラベルに対してメモリ１０２上に空ブロックを作成する。
Ｓ３０２として、マルチコアＣＰＵ１０１は、処理Ｓとして、新規の文字列データ１１１を１本ずつＮＩＦ１０４を介して入力し、その入力文字列の末尾文字を$ブロックに登録し、入力文字列の残りの文字列をその末尾文字にリンクする。入力文字列の末尾文字は、長さ０の接尾辞（空文字列ε）とも言える。
【００２７】
Ｓ３１１として、マルチコアＣＰＵ１０１は、パラメータｍを０にセットする。
Ｓ３１２として、マルチコアＣＰＵ１０１は、長さｍの全てのアルファベット文字列ｗに対して、図５の処理Ｐ（ｗ）を並列に実行する。
Ｓ３１３として、マルチコアＣＰＵ１０１は、ｍの値を１つ増やす。
Ｓ３１４として、マルチコアＣＰＵ１０１は、ｍ＜ｒか否かを判定する。Ｓ３１４でＹｅｓならＳ３１２に戻り、ＮｏならＳ３２１に進む。
【００２８】
Ｓ３２１として、マルチコアＣＰＵ１０１は、ブロック内のエントリからリンクされた未登録文字列が残っているか否かを判定する。Ｓ３２１でＹｅｓならＳ３２２に、ＮｏならＳ３３１に進む。
Ｓ３２２として、マルチコアＣＰＵ１０１は、長さｒ−１の全てのアルファベット文字列ｗに対して、図６の処理Ｑ（ｗ）を並列に実行する。
Ｓ３３１として、マルチコアＣＰＵ１０１は、各ブロック内の登録されたエントリ文字を連結したブロックごとの連結文字列を作成する。
Ｓ３３２として、マルチコアＣＰＵ１０１は、Ｓ３３１の連結文字列をブロックのラベル順に１本に連結した出力文字列を作成し、その出力文字列を文字列辞書１１２としてＨＤＤ１０３に出力する。
【００２９】
図５は、Ｓ３１２から呼び出される処理Ｐ（ｗ）および処理Ｉ（ｃ）の詳細を示すフローチャートである。
まず、処理Ｐ（ｗ）について説明する。
Ｓ３５１として、マルチコアＣＰＵ１０１は、ポインタＨをｗ$ブロック先頭にリセットする。
Ｓ３５２として、マルチコアＣＰＵ１０１は、全てのアルファベット文字ｃに対して処理Ｉ（ｃ）を行う。
Ｓ３６１として、マルチコアＣＰＵ１０１は、ポインタＨの参照先の登録文字をｃとし、その登録文字ｃからリンクされた文字列（未登録文字列）をｕとする。
【００３０】
Ｓ３６２として、マルチコアＣＰＵ１０１は、Ｓ３６１の文字列ｕが存在するか否かを判定する。Ｓ３６２でＹｅｓならＳ３６３に、ＮｏならＳ３７１に進む。
Ｓ３６３として、マルチコアＣＰＵ１０１は、ｕの末尾文字をｄとし、ｕから末尾文字ｄを除いた残りの文字列をｖとする。
Ｓ３６４として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）の位置にｄを挿入し、その挿入したｄからｖへのリンクを張る。
Ｓ３６５として、マルチコアＣＰＵ１０１は、ｕ及びそのｃからｕへのリンクを削除する。
Ｓ３７１として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）を次のエントリに１つ分進める。
Ｓ３７２として、マルチコアＣＰＵ１０１は、Ｈはｗ$ブロック末尾か否かを判定する。Ｓ３７２でＹｅｓなら処理Ｐ（ｗ）を終了し、ＮｏならＳ３７３に進む。
Ｓ３７３として、マルチコアＣＰＵ１０１は、ポインタＨを次のエントリに１つ分進める。
【００３１】
次に、処理Ｉ（ｃ）について説明する。
Ｓ３５３として、マルチコアＣＰＵ１０１は、ｒ＜ｍ−１か否かを判定する。Ｓ３５３でＹｅｓならＳ３５４に、ＮｏならＳ３５５に進む。
Ｓ３５４として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）をｃｗ＄ブロック先頭にリセットする。
Ｓ３５５として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）をｃｗブロック先頭にリセットする。
【００３２】
図６は、Ｓ３２２から呼び出される処理Ｑ（ｗ）の詳細を示すフローチャートである。
Ｓ２０１として、マルチコアＣＰＵ１０１は、変数ａにアルファベットの最初の文字を代入する。例えば、アルファベット文字がＡとＴの２種類なら、変数ａに「Ａ」が代入される。
Ｓ２０２として、マルチコアＣＰＵ１０１は、ポインタＫ（ａ）を、処理Ｐ（ｗ）がａｗブロック内に書き込んだ位置の直後の位置にリセットする。
Ｓ２０３として、マルチコアＣＰＵ１０１は、ａをアルファベットの次の文字に更新する。例えば、アルファベット文字がＡとＴの２種類であり、現在の変数ａに「Ａ」が代入されているなら、次の「Ｔ」が変数ａに代入される。
Ｓ２０４として、マルチコアＣＰＵ１０１は、Ｓ２０３で代入できるａが存在するか否かを判定する。Ｓ２０４でＹｅｓならＳ２０２に戻り、ＮｏならＳ２１１に進む。
【００３３】
Ｓ２１１として、マルチコアＣＰＵ１０１は、Ｓ２０１と同様に、再びａをアルファベットの最初の文字とする。
Ｓ２１２として、マルチコアＣＰＵ１０１は、図７の処理Ｒ（ｗ、ａ）を逐次的に実行する。
Ｓ２１３として、マルチコアＣＰＵ１０１は、Ｓ２０３と同様に、ａをアルファベットの次の文字に更新する。
Ｓ２１４として、マルチコアＣＰＵ１０１は、Ｓ２０４と同様に、Ｓ２１３で代入できるａが存在するか否かを判定する。Ｓ２１４でＹｅｓならＳ２１２に戻り、Ｎｏなら処理Ｑ（ｗ）を終了する。
【００３４】
図７は、Ｓ２１２から呼び出される処理Ｒ（ｗ、ａ）の詳細を示すフローチャートである。
Ｓ２２０として、マルチコアＣＰＵ１０１は、ポインタＨをｗａブロック先頭にリセットする。
Ｓ２２１として、マルチコアＣＰＵ１０１は、ポインタＨの参照先の登録文字をｃとし、そのｃからのリンク先文字列をｕとする。
Ｓ２２１ｂとして、マルチコアＣＰＵ１０１は、ｕが存在するか否かを判定する。Ｓ２２１ｂでＹｅｓならＳ２２１ｃに、ＮｏならＳ２２２に進む。
Ｓ２２１ｃとして、マルチコアＣＰＵ１０１は、ｕが空文字列εか否かを判定する。Ｓ２２１ｃでＹｅｓならＳ２２３に、ＮｏならＳ２２４に進む。
【００３５】
Ｓ２２２として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）を次のエントリに１つ分進める。
Ｓ２２３として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）の位置に区切り文字＄を挿入する。
Ｓ２２４として、マルチコアＣＰＵ１０１は、ｕの末尾文字をｄとし、ｕから末尾文字をｄを除いた残りの文字列をｖとする。
Ｓ２２５として、マルチコアＣＰＵ１０１は、ポインタＫ（ｃ）の位置にｄを挿入し、そのｄからｖへのリンクを張る。
Ｓ２２６として、マルチコアＣＰＵ１０１は、ｕ及びｃからｕへのリンクを削除する。
Ｓ２２７として、マルチコアＣＰＵ１０１は、Ｈはｗａブロック末尾か否かを判定する。Ｓ２２７でＹｅｓなら処理Ｒ（ｗ、ａ）を終了し、ＮｏならＳ２２８に進む。
Ｓ２２８として、マルチコアＣＰＵ１０１は、ポインタＨを次のエントリに１つ分進める。
【００３６】
以上、図３〜図７のフローチャートで説明した各処理について、図８〜図１２の具体例で明らかにする。この具体例は、文字列データ１１１を構成するアルファベット文字はＡとＴの２種類で、ｒ＝２の場合である。
Ｓ３０１（空ブロック生成処理）では、＄ブロック、Ａ＄ブロック、Ｔ＄ブロック、ＡＡブロック、ＡＴブロック、ＴＡブロック、ＴＴブロックそれぞれの空ブロックが作成される。
【００３７】
図８は、処理Ｓおよび処理Ｐ（ｗ）の具体例を示す説明図である。
Ｓ３０２（処理Ｓ）では、枠内４００に示す処理が行われる。つまり空ブロックであった＄ブロック４１２が、処理Ｓにより以下の３エントリが登録される。なお、枠内４１１には３行の文字列データ１１１が読み込まれている。
・処理Ｓとして、枠内４１１の１行目「ＡＡＴＴＡ」を、＄ブロック４１２の新たなＡとそのリンク先のＡＡＴＴ（符号４１３）として登録する。
・処理Ｓとして、枠内４１１の２行目「ＡＴＡＡＴ」を、＄ブロック４１２の新たなＴとそのリンク先のＡＴＡＡ（符号４１４）として登録する。
・処理Ｓとして、枠内４１１の３行目「ＴＡＴＡＴ」を、＄ブロック４１２の新たなＴとそのリンク先のＴＡＴＡ（符号４１５）として登録する。
【００３８】
枠内４２０に示すように、Ｓ３１２から呼び出される１回目（ｍ＝０）の処理Ｐ（ｗ）では、＄ブロック４１２の３エントリからそれぞれ１文字ずつ別のブロックに登録される。なお、長さｍ＝０の文字列ｗは空文字列εだけなので、ｍ＝０のときは処理Ｐ（ε）だけ実行される。
・処理Ｐ（ε）として、＄ブロック４１２のＡからリンクされるＡＡＴＴ（符号４１３）を、Ａ＄ブロック４２１の新たなＴとそのリンク先のＡＡＴとして登録する。その登録後に＄ブロック４１２のＡを残しつつ、そのリンク先のＡＡＴＴ（符号４１３）とそのリンクを削除する。
・処理Ｐ（ε）として、＄ブロック４１２のＴからリンクされるＡＴＡＡ（符号４１４）を、Ｔ＄ブロック４２２の新たなＡとそのリンク先のＡＴＡとして登録する。その登録後に＄ブロック４１２のＴを残しつつ、そのリンク先のＡＴＡＡ（符号４１４）とそのリンクを削除する。
・処理Ｐ（ε）として、＄ブロック４１２のＴからリンクされるＴＡＴＡ（符号４１５）を、Ｔ＄ブロック４２２の新たなＡとそのリンク先のＴＡＴとして登録する。その登録後に＄ブロック４１２のＴを残しつつ、そのリンク先のＴＡＴＡ（符号４１５）とそのリンクを削除する。これにより、＄ブロック４１２は、＄ブロック４８１となる。
【００３９】
なお、＄ブロック４１２のＡからリンクされるＡＡＴＴ（符号４１３）を、Ａ＄ブロック４２１の新たなＴとそのリンク先のＡＡＴとして登録し、その登録後に＄ブロック４１２のＡを残しつつ、そのリンク先のＡＡＴＴ（符号４１３）とそのリンクを削除する例を、図５の処理Ｐ（ｗ）に対応付けて説明する。
上記の例での今回の登録対象となる未登録文字列は、「ＡＡＴＴ（符号４１３）」である。この未登録文字列へのリンク元となるエントリが属する登録元ブロックは、「＄ブロック４１２」である。
前記のフローチャートにおいて、処理Ｐ（ｗ）では、登録元ブロックをｗ＄ブロック（Ｓ３５１）とし、未登録文字列を文字列ｕ（Ｓ３６１）とし、リンク元のエントリをポインタＨが示す位置にある文字ｃ（Ｓ３６１）として説明した。
【００４０】
上記の例での未登録文字列の登録先ブロックは、「Ａ＄ブロック４２１」である。この登録先ブロック内に新たに登録されるエントリ「Ｔ」は、未登録文字列「ＡＡＴＴ」の末尾文字である。エントリ「Ｔ」からのリンク先の文字列「ＡＡＴ」は、未登録文字列「ＡＡＴＴ」の末尾文字を除いた残りの文字である。
前記のフローチャートにおいて、処理Ｐ（ｗ）では、登録先ブロックをｃｗ＄ブロック（Ｓ３５４）またはｃｗブロック（Ｓ３５５）とし、新たに登録されるエントリをポインタＫ（ｃ）が示す位置に挿入される文字ｄ（Ｓ３６３）とし、新たに登録されるリンク先の文字列を文字列ｖ（Ｓ３６３）として説明した。
【００４１】
枠内４２０に示すように、Ｓ３１２から呼び出される２回目（ｍ＝１）の処理Ｐ（ｗ）では、長さｍの文字列ｗとしては、ＡとＴの２種類があるので、処理Ｐ（Ａ）と処理Ｐ（Ｔ）とが並列に実行される。換言すると、処理Ｐ（Ａ）が扱うブロックの集合と、処理Ｐ（Ｔ）が扱うブロックの集合とが互いに独立に実行可能な部分処理として２つのグループにグループ化されている。
【００４２】
・処理Ｐ（Ａ）として、Ａ＄ブロック４２１のＴからリンクされるＡＡＴを、ＴＡブロック４３３の新たなＴとそのリンク先のＡＡとして登録する。その登録後にＡ＄ブロック４２１のＴを残しつつ、そのリンク先のＡＡＴとそのリンクを削除する。これにより、Ａ＄ブロック４２１は、エントリＴだけが残るＡ＄ブロック４８２になる。また、ＡＡブロック４３１は、今回の処理Ｐ（Ａ）としては登録先ブロックには該当しないが、次の処理（枠内４３５）で扱うので、ここではわかりやすくするために記載した。このように登録先ブロックには該当しないブロックも適宜図示することにする。
【００４３】
・処理Ｐ（Ｔ）として、Ｔ＄ブロック４２２のＡからリンクされるＡＴＡを、ＡＴブロック４３２の新たなＡとそのリンク先のＡＴとして登録する。その登録後にＴ＄ブロック４２２のＡを残しつつ、そのリンク先のＡＴＡとそのリンクを削除する。
・処理Ｐ（Ｔ）として、Ｔ＄ブロック４２２のＡからリンクされるＴＡＴを、ＡＴブロック４３２の新たなＴとそのリンク先のＴＡとして登録する。その登録後にＴ＄ブロック４２２のＡを残しつつ、そのリンク先のＴＡＴとそのリンクを削除する。
その後、ｍ＝ｒ＝２となり、Ｓ３１４でＮｏとなるので、３回目（ｍ＝２）の処理Ｐ（ｗ）は実行されない。
そして、ＴＡブロック４３３の未登録文字列「ＡＡ」などが残っているので、Ｓ３２１でＹｅｓとなり、Ｓ３２２が実行される。
【００４４】
図９は、図８の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
枠内４４０に示すように、Ｓ３２２から呼び出される１回目の処理Ｑ（ｗ）では、長さｒ−１の全てのアルファベット文字列はＡとＴの２通りがあるので、処理Ｑ（Ａ）と処理Ｑ（Ｔ）とが並列に実行される。
【００４５】
処理Ｑ（Ａ）内のＳ２１２では、文字ａ＝Ａ、Ｔに対して、処理Ｒ（Ａ、Ａ）と処理Ｒ（Ａ、Ｔ）とがこの順序で逐次実行される。
処理Ｑ（Ａ）の入力グループ（枠内４３５）と、処理Ｑ（Ａ）の出力グループ（枠内４３７）とを示す。
処理Ｑ（Ａ）の入力グループ側では逐次的に参照すべきブロックを纏めてグループ化されている。処理Ｑ（Ａ）の出力グループ側では同時並行に書き込むべきブロックを纏めてグループ化されている。
【００４６】
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ａ）として、ＡＡブロック４３１にはリンクを有するエントリが無いので、処理をスキップする。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ｔ）として、ＡＴブロック４３２のＡからリンクされるＡＴを、ＡＡブロック４４１の新たなＴとそのリンク先のＡとして登録する。その登録後にＡＴブロック４３２のＡを残しつつ、そのリンク先のＡＴとそのリンクを削除する。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ｔ）として、ＡＴブロック４３２のＴからリンクされるＴＡを、ＴＡブロック４４３の新たなＡとそのリンク先のＴとして登録する。その登録後にＡＴブロック４３２のＴを残しつつ、そのリンク先のＴＡとそのリンクを削除する。
【００４７】
なお、ＡＴブロック４３２のＡからリンクされるＡＴを、ＡＡブロック４４１の新たなＴとそのリンク先のＡとして登録し、その登録後にＡＴブロック４３２のＡを残しつつ、そのリンク先のＡＴとそのリンクを削除する例を、図７のＲ（ｗ、ａ）に対応付けて説明する。
上記の例での今回の登録対象となる未登録文字列は、「ＡＴ」である。この未登録文字列へのリンク元となるエントリが属する登録元ブロックは、「ＡＴブロック４３２」である。
前記のフローチャートにおいて、Ｒ（ｗ、ａ）では、登録元ブロックをｗａブロック（Ｓ２２０）とし、未登録文字列を文字列ｕ（Ｓ２２１）とし、リンク元のエントリをポインタＨが示す位置にある文字ｃ（Ｓ２２１）として説明した。
【００４８】
上記の例での未登録文字列の登録先ブロックは、「ＡＡブロック４４１」である。この登録先ブロック内に新たに登録されるエントリ「Ｔ」は、未登録文字列「ＡＴ」の末尾文字である。エントリ「Ｔ」からのリンク先の文字列「Ａ」は、未登録文字列「ＡＴ」の末尾文字を除いた残りの文字である。
前記のフローチャートにおいて、Ｒ（ｗ、ａ）では、登録先ブロックをａｗブロック（Ｓ２０２）とし、新たに登録されるエントリをポインタＫ（ｃ）が示す位置に挿入される文字ｄ（Ｓ２２４）とし、新たに登録されるリンク先の文字列を文字列ｖ（Ｓ２２４）として説明した。つまり、Ｒ（ｗ、ａ）の登録先ブロックは、ｃｗブロックからなるグループ（ｃは任意の文字）であって、全てのａについて共通であり、また、Ｓ２０２でリセットされた同じポインタＫ（ｃ）を順に引き継いで利用する。その結果、各ｃｗブロックへの書き込みは辞書順に正しく行われる。
【００４９】
処理Ｑ（Ｔ）内のＳ２１２では、文字ａ＝Ａ、Ｔに対して、処理Ｒ（Ｔ、Ａ）と処理Ｒ（Ｔ、Ｔ）とがこの順序で逐次実行される。
処理Ｑ（Ｔ）の入力グループ（枠内４３６）と、処理Ｑ（Ｔ）の出力グループ（枠内４３８）とを示す。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ａ）として、ＴＡブロック４３３のＴからリンクされるＡＡを、ＴＴブロック４４４の新たなＡとそのリンク先のＡとして登録する。その登録後にＴＡブロック４３３のＴを残しつつ、そのリンク先のＡＡとそのリンクを削除する。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ｔ）として、ＴＴブロック４３４にはリンクを有するエントリが無いので、処理をスキップする。
そして、ＡＡブロック４４１の未登録文字列「Ａ」などが残っているので、Ｓ３２１でＹｅｓとなり、Ｓ３２２が実行される。
【００５０】
図１０は、図９の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
枠内４５０に示すように、２回目の処理Ｑ（ｗ）でも、処理Ｑ（Ａ）と処理Ｑ（Ｔ）とが並列に実行される。
処理Ｑ（Ａ）の入力グループ（枠内４４５）と、処理Ｑ（Ａ）の出力グループ（枠内４４７）とを示す。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ａ）として、ＡＡブロック４４１のＴからリンクされるＡを、ＴＡブロック４５３の新たなＡとそのリンク先のεとして登録する。この登録のための挿入位置４３９は、ポインタＫ（Ｔ）により指示される。その登録後にＡＡブロック４４１のＴを残しつつ、そのリンク先のＡとそのリンクを削除する。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ｔ）として、ＡＴブロック４４２にはリンクを有するエントリが無いので、処理をスキップする。つまり、ＡＡブロック４５１内へのポインタＫ（Ａ）と、ＴＡブロック４５３内へのポインタＫ（Ｔ）とを先に進める。
【００５１】
処理Ｑ（Ｔ）の入力グループ（枠内４４６）と、処理Ｑ（Ｔ）の出力グループ（枠内４４８）とを示す。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ａ）として、ＴＡブロック４４３のＡからリンクされるＴを、ＡＴブロック４５２の新たなＴとそのリンク先のεとして登録する。この登録のための挿入位置４５９は、ポインタＫ（Ａ）により指示される。その登録後にＴＡブロック４４３のＡを残しつつ、そのリンク先のＴとそのリンクを削除する。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ｔ）として、ＴＴブロック４４４のＡからリンクされるＡを、ＡＴブロック４５２の新たなＡとそのリンク先のεとして登録する。その登録後にＴＴブロック４４４のＡを残しつつ、そのリンク先のＡとそのリンクを削除する。
そして、ＴＡブロック４５３の未登録文字列「ε」などが残っているので、Ｓ３２１でＹｅｓとなり、Ｓ３２２が実行される。
【００５２】
図１１は、図１０の後に実行される、処理Ｑ（ｗ）および処理Ｒ（ｗ、ａ）の具体例を示す説明図である。
枠内４６０に示すように、３回目の処理Ｑ（ｗ）でも、処理Ｑ（Ａ）と処理Ｑ（Ｔ）とが並列に実行される。
処理Ｑ（Ａ）の入力グループ（枠内４５５）と、処理Ｑ（Ａ）の出力グループ（枠内４５７）とを示す。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ａ）として、ＡＡブロック４５１にはリンクを有するエントリが無いので、処理をスキップする。つまり、ＡＡブロック４６１内へのポインタＫ（Ａ）とＴＡブロック４６３内へのポインタＫ（Ｔ）とを先に進める。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ｔ）として、ＡＴブロック４５２のＴからリンクされるεを、ＴＡブロック４６３の新たな＄として登録する。その登録後にＡＴブロック４５２のＴを残しつつ、そのリンク先のεとそのリンクを削除する。
・処理Ｑ（Ａ）の処理Ｒ（Ａ、Ｔ）として、ＡＴブロック４５２のＡからリンクされるεを、ＡＡブロック４６１の新たな＄として登録する。その登録後にＡＴブロック４５２のＡを残しつつ、そのリンク先のεとそのリンクを削除する。
【００５３】
処理Ｑ（Ｔ）の入力グループ（枠内４５６）と、処理Ｑ（Ｔ）の出力グループ（枠内４５８）とを示す。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ａ）として、ＴＡブロック４５３のＡからリンクされるεを、ＡＴブロック４６２の新たな＄として登録する。その登録後にＴＡブロック４５３のＡを残しつつ、そのリンク先のεとそのリンクを削除する。
・処理Ｑ（Ｔ）の処理Ｒ（Ｔ、Ｔ）として、ＴＴブロック４５４にはリンクを有するエントリが無いので、処理をスキップする。つまり、ＡＴブロック４６２内へのポインタＫ（Ａ）と、ＴＴブロック４６４内へのポインタＫ（Ｔ）とを先に進める。
これにより、未登録文字列がすべて解消されたので、Ｓ３２１でＮｏとなり、Ｓ３３１が実行される。
【００５４】
図１２は、図１１の後に実行される、文字列辞書１１２の出力処理を示す説明図である。
Ｓ３３１（ブロックごとの連結文字列の作成処理）では、ラベル順にソートした各ブロック（＄ブロック４８１、Ａ＄ブロック４８２、ＡＡブロック４６１、ＡＴブロック４６２、Ｔ＄ブロック４８３、ＴＡブロック４６３、ＴＴブロック４６４）に登録されたエントリを、図示した矢印の順に文字列４７１〜４７７として抽出する。
Ｓ３３２（文字列辞書１１２の出力処理）では、枠内４９０に示すように、文字列４７１〜４７７を順に１本に連結した出力文字列を文字列辞書１１２として作成する。
【００５５】
以上説明した本実施形態では、文字列辞書１１２の構築処理（Ｓ２３１）として、文字列データ解析装置１は、ＮＩＦ１０４を介して入力して、文字列データ１１１から文字列を入力する。文字列データ解析装置１は、入力された文字列を未登録文字列とし、その全ての接尾辞を短いものから順に、処理Ｐ（ｗ）、処理Ｑ（ｗ）、処理Ｒ（ｗ、ａ）で示した各手順に従って、空ブロックに順次登録していく。
ここで、接尾辞をブロックに登録するとは、接尾辞に先行する文字（但し、接尾辞が文字列全体に一致する場合は区切り文字＄）をブロックに登録することである。ブロックに登録された各文字に対して、それに後続する接尾辞を復元する効率的な計算方法は公知である（非特許文献１）。また、未登録文字列から接尾辞を除いた残りの文字列を、今回登録した接尾辞にリンクして一時的に保持する。
【００５６】
全ての文字列の全ての接尾辞に対してブロックへの登録処理が完了した後、図１２で示した手順に従って、全てのブロックに対して、そこに登録されている文字を連結した文字列を作成し、さらに、それらの文字列をブロックのラベルの辞書式順番に従って連結した文字列辞書１１２を、ＢＷ変換としてＨＤＤ１０３内に出力する。
【００５７】
なお、Ｓ３０１において、既に作成済みの文字列辞書１１２がＨＤＤ１０３内（または、ネットワークの接続先からＮＩＦ１０４を介して取り込んでＨＤＤ１０３内）にある場合は、空ブロックの代わりに、文字列辞書１１２を作成したときのブロックの情報をメモリ上にロードしてもよい。この場合、作成済みの文字列辞書１１２に対して、ＮＩＦ１０４を介して新たに入力した文字列データ１１１を、追加登録することができる。
【００５８】
また、Ｓ３６４，Ｓ２２３，Ｓ２２５で説明したように、メモリ１０２上のブロックに毎回新たなエントリが追加登録される際、リストであるブロックへの挿入処理が必要となる。そこで、ブロックのデータ構造としては、（非特許文献４に記載された平衡木のような）動的構造を採用してもよいし、あるいは、（特許文献１に記載されているようにリストのコピーを毎回再構築するような）静的構造を採用してもよい。
【００５９】
以下では、本実施形態の文字列辞書１１２の構築処理について、その並列計算における並列度や待ち合わせなどについて、補足説明する。
前記の例では、アルファベット文字をＡとＴの２種類としたが、アルファベット文字の種類をｈ種類（文字ａ１、ａ２、…、ａｈ）に拡張する。
【００６０】
まず、処理Ｐ（ｗ）の並列度について説明する。
処理Ｐ（ｗ）が読み込む登録元ブロックはｗ＄ブロックであり、各ｍに対して、文字列ｗが異なれば相異なる。
処理Ｐ（ｗ）が書き出す登録先ブロックは、ｍがｒ−１未満ならば、ａ１ｗ＄ブロック、ａ２ｗ＄ブロック、…、ａｈｗ＄ブロックであり、ｍ＝ｒ−１ならば、ａ１ｗブロック、ａ２ｗブロック、…、ａｈｗブロックである。登録先ブロックでは、いずれの場合も、文字列ｗが異なれば互いに排反である。従って、各ｍに対して、処理Ｐ（ｗ）は互いに干渉することなく、独立に並列に実行可能となる。
【００６１】
次に、処理Ｑ（ｗ）の並列度について説明する。
処理Ｑ（ｗ）が読み込む登録元ブロックはｗａ１ブロック、ｗａ２ブロック、…、ｗａｈブロックであり、文字列ｗが異なれば互いに排反である。
処理Ｑ（ｗ）が書き出す登録先ブロックは、ａ１ｗブロック、ａ２ｗブロック、…、ａｈｗブロックであり、これらも、文字列ｗが異なれば互いに排反である。従って、処理Ｑ（ｗ）は、互いに干渉することなく、独立に並列に実行可能となる。
【００６２】
そして、処理Ｒ（ｗ、ａ）の並列度について説明する。
処理Ｒ（ｗ、ａ１）、Ｒ（ｗ、ａ２）、…、Ｒ（ｗ、ａｈ）での登録先ブロックはｈ個あり、それらは、ａ１ｗブロック、ａ２ｗブロック、…、ａｈｗブロックで共通である。これらの登録処理はアルファベット順に逐次的に実行されるため、各ブロックへの登録処理もアルファベット順に正しく行われる。
このように、順番を守って逐次実行しなければならない処理Ｒ（ｗ、ａ）の数は、アルファベットのサイズに等しく、パラメータｒには依存せず一定である。従って、パラメータｒを増やして、並列処理としての粒度を細かくしても、逐次実行の待ち合わせの長さは一定に保たれ、待ち合わせによるＣＰＵ稼働率低下を生じることはない。
【００６３】
以上により、互いに独立に行うことができる部分処理に細分化され、処理Ｒ（ｗ、ａ１）、Ｒ（ｗ、ａ２）、…、Ｒ（ｗ、ａｈ）を逐次実行する以外に待ち合わせの必要はなく、待ち合わせによるプロセッサ稼働率の低下を回避することができる。
【００６４】
ここで、マルチコアＣＰＵ１０１は、正整数パラメータｒの値を入力させてもよいし、マルチコアＣＰＵ１０１のＣＰＵコア数をもとに自動計算してもよい。
Ｓ３０１で説明したように、ｒ＝２でアルファベット文字がＡとＴの２種類のときには、７種類のブロック（＄ブロック、Ａ＄ブロック、Ｔ＄ブロック、ＡＡブロック、ＡＴブロック、ＴＡブロック、ＴＴブロック）を使用した。つまり、計算式「７＝２の３乗−１」を一般化した計算式「（ブロック数）＝（（ｈの（ｒ＋１）乗−1）／（ｈ−１）」により、ブロック数を求めることができる。そして、マルチコアＣＰＵ１０１は、例えば、（ＣＰＵコア数）×Ｋ＝（ブロック数）、（Ｋは例えば数十倍を示す１０〜９０の定数）となるように、ＣＰＵコア数からブロック数を求め、そのブロック数を前記の一般化した計算式に代入することにより、パラメータｒを自動計算することができる。
【００６５】
正整数パラメータｒを増やすとブロック数は指数関数的に増大するので、ブロック数がＣＰＵコア数の数十倍程度となるようにｒの値を定めることができる。このとき、マルチ・スレッドによる動的負荷分散を行えば、処理Ｐ（ｗ）や処理Ｑ（ｗ）の計算時間のバラツキが生じても、コア間の計算負荷を均等化でき、全てのコアを有効に使った効率的な高速化が可能となる。
例えば、独立に並列実行可能な処理Ｑ（ｗ）の数は、長さｒ−１の文字列ｗの数だけある。この数は、アルファベットのサイズをｈとすると、ｈのｒ−１乗に等しい。従って、ＤＮＡ配列データのようにｈ＝４の場合であっても、処理Ｑ（ｗ）の数が利用可能なＣＰＵコア数の数十倍程度になるようにｒを選ぶことができる。
これにより、ＣＰＵコア数の数十倍程度の部分処理に細分化する方法を提供し、また、部分処理どうしの待ち合わせによるプロセッサ稼働率の低下を回避する方法を提供することができる。
【００６６】
なお、本発明は前記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、前記した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。
また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。
また、各実施例の構成の一部について、他の構成の追加・削除・置換をすることが可能である。また、上記の各構成、機能、処理部、処理手段などは、それらの一部または全部を、例えば集積回路で設計するなどによりハードウェアで実現してもよい。
また、前記の各構成、機能などは、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。
【００６７】
各機能を実現するプログラム、テーブル、ファイルなどの情報は、メモリや、ハードディスク、ＳＳＤ（Solid State Drive）などの記録装置、または、ＩＣ（Integrated Circuit）カード、ＳＤカード、ＤＶＤ（Digital Versatile Disc）などの記録媒体に置くことができる。
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際にはほとんど全ての構成が相互に接続されていると考えてもよい。
【符号の説明】
【００６８】
１      文字列データ解析装置
１０１  マルチコアＣＰＵ
１０２  メモリ
１０３  ＨＤＤ
１０４  ＮＩＦ
１０５  入力部
１０６  表示・出力部
１０７  バス
１１１  文字列データ
１１２  文字列辞書
１２１  問合せ文字列
１２２  検索結果
５０１  患者
５０２  ＤＮＡサンプル
５０３  ＤＮＡシーケンサ
５０４  ＤＮＡ配列データ
５０５  ＤＮＡ配列辞書
５２１  解析指示
５２２  解析結果
５１１  遺伝子パネル
５１２  データベース
【図１】
0006622921.tif 000002
【図２】
0006622921.tif 000003
【図３】
0006622921.tif 000004
【図４】
0006622921.tif 000005
【図５】
0006622921.tif 000006
【図６】
0006622921.tif 000007
【図７】
0006622921.tif 000008
【図８】
0006622921.tif 000009
【図９】
0006622921.tif 000010
【図１０】
0006622921.tif 000011
【図１１】
0006622921.tif 000012
【図１２】
0006622921.tif 000013