以下、実施の形態について図面を参照して説明する。
(第1実施形態)
まず、第1実施形態について説明する。
図1は、本実施形態の電子機器のシステム構成の例を示す。この電子機器は、例えば、ストレージシステム1として実現され得る。このストレージシステム1は、例えば、ネットワーク経由で接続されるクライアント装置2からの要求に応じて、データの書き込み、データの読み出し、データの更新、データの削除などを実行するファイルサーバとして機能する。図1に示すように、ストレージシステム1は、ネットワークスイッチ10、複数のコネクションユニット(CU)20、および複数のノードモジュール(NM)30を備えている。
NM30は、ノードコントローラ(NC)31と、一つ以上のNAND型フラッシュメモリ32とを有している。NC31は、NAND型フラッシュメモリ32に対するアクセス制御と、データの転送制御とを実行する。NC31は、例えば4系統の入出力ポートを有しており、NC31同士を接続することにより、複数のNM30を、例えばマトリックス状に相互に接続することができる。複数のNM30を相互に接続することにより、ストレージシステム1は、大容量のデータ記憶領域40を論理的に構築する。
CU20は、クライアント装置2からの要求に応じて、前述のように構築されたデータ記憶領域40に対するデータの入出力処理(データの更新、データの削除を含む)を実行する。より詳細には、クライアント装置2からの要求に対応する、複数のNM30の中の目的のNM30に対してデータの入出力命令を発行する。以下、CU20からNM30へ発行されるデータの入出力命令を、コマンドと称することがある。
CU20は、CPU21、RAM22およびNMインタフェース23を有している。CU20の各機能は、RAM22に格納され、CPU21によって実行されるプログラムにより実現される。NMインタフェース23は、NM30、より詳細には、NC31との間の通信を実行する。NMインタフェース23は、複数のNM30の中のいずれか1つのNM30のNC31と接続されている。つまり、CU20は、NMインタフェース23を介して、複数のNM30の中のいずれか1つのNM30と直接的に接続され、NM30のNC31を介して、その他のNM30と間接的に接続される。CU20と直接的に接続されるNM30は、CU20毎に異なっている。
前述したように、CU20は、複数のNM30の中のいずれか一つのNM30と直接的に接続される。したがって、CU20が、直接的に接続されるNM30以外のNM30に対してデータの入出力命令を発行する場合においても、その入出力命令は、まず、直接的に接続されるNM30へ転送される。その後、その入出力命令は、各NM30のNC31を介して目的のNM30まで転送される。
例えば、NM30がマトリックス状に相互に接続される場合、行番号と列番号との組合せで各NM30に識別子(M,N)が付されるものと想定すると、NC31は、自NM30の識別子と、入出力命令の送り先として指定される識別子とを比較することにより、第1に、その入出力命令が自NM30宛てか否かを判断できる。自NM30宛てでない場合、NC31は、自NM30の識別子と、入出力命令の送り先として指定される識別子との関係、より詳細には、行番号、列番号それぞれの大小関係から、第2に、隣接するNM30の中のいずれのNM30へ転送すべきかを判断できる。入出力命令を目的のNM30まで転送する手法については、特定の手法に限定されるものではなく、既知のいずれの手法も採用し得る。本来であれば転送先として選ばれることがないNM30への経路も、予備経路として使用され得る。
また、NM30による、入出力命令に応じた入出力処理の結果、すなわち、NAND型フラッシュメモリ32に対するアクセスの結果も、前述した入出力命令の転送と同様、NC31の働きにより、他のNM30をいくつか経由して入出力命令の発行元であるCU20まで転送される。例えば、入出力命令の発行元の情報として、CU20が直接的に接続されるNM30の識別子を含ませることで、この識別子を処理結果の転送先として指定することができる。
さらに、NC31は、割り込み要求信号を転送するための入出力ポートを別途例えば4系統有しており、前述した入出力命令および処理結果と同様、NM30からCU20までの割り込み要求信号の転送経路が動的に決定される。
ネットワークスイッチ10は、クライアント装置2からの要求を受け付け、その要求を複数のCU20のいずれかに転送する。典型的には、ネットワークスイッチ10は、複数のCU20の負荷が均等となるように、クライアント装置2からの要求を複数のCU20へ振り分ける。なお、ここでは、ネットワークスイッチ10を設ける例を示しているが、複数のCU20の中の1つのCU20がマスタとして動作して、ネットワークスイッチ10の役割を担ってもよい。ネットワークスイッチ10は、CU20から受領した処理結果をクライアント装置2へ返送する。
図2は、NM30の構成(NC31の詳細な構成)の一例を示す図である。
前述したように、NM30は、NC31と、一つ以上のNAND型フラッシュメモリ32とを有している。NC31は、図2に示されるように、CPU311、RAM312、I/Oコントローラ313およびNANDインタフェース314を有している。NC31の各機能は、RAM312に格納され、CPU311によって実行されるプログラムにより実現される。I/Oコントローラ313は、CU20(より詳細には、NMインタフェース23)または他のNM30(より詳細には、NC31)との間の通信を実行する。NANDインタフェース314は、NAND型フラッシュメモリ32に対するアクセスを実行する。
本ストレージシステム1は、一つのファイルを、サイズがより小さい複数のファイル(以下、分割ファイルとも称する)に分割するファイル分割機能を有している。例えば、複数のCU20は、一つのファイルを分割することにより得られる複数の分割ファイルのそれぞれを、並列に生成することができる。
ファイルは、特定のフォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される。フォーマットは、一つ以上のフィールドを含むレコード構造と、各フィールドに設定可能なデータに関する種々の規則とを規定する。この規則には、データの形式(例えば、文字、数字、記号、余白等)、文字数(バイト長)、行数、特定の位置に配置すべきデータ、フィールド間の関係、等が規定され得る。特定の位置に配置すべきデータの規則は、例えば、行頭/行末に特定の文字を配置することを規定する。フィールド間の関係の規則は、例えば、第1フィールドに含まれる文字数と第2フィールドに含まれる文字数とが同一であることを規定する。したがって、ファイルを構成する一つのレコードは、その特定のフォーマットで規定された一つ以上のフィールドで構成されるデータのまとまりである。各フィールドのバイト長や行数は可変とすることができ、そのようなフィールドを含むレコードを可変長レコードと称する。フォーマットにはさらに、一つのレコードの最大サイズ(最大のバイト長)が規定されていてもよい。
レコードがエンコードされるフォーマットには、任意のフォーマットを用いることができ、例えば、バイト長と行数とが可変であるレコード構造を有していてもよい。このフォーマットは、例えば、ゲノム解析に用いられるFASTQフォーマットである。また、改行またはファイル最終文字(EOFなど)で終端する任意のASCII文字の可変長バイト列をレコードフォーマットとすることも可能である。この場合、任意のテキストファイルを本発明で扱うことができる。
ところで、ファイルを複数の分割ファイルに分割するLinuxのsplitコマンドでは、各分割ファイルに含まれる最大の行数や、各分割ファイルに含まれる最大のバイト長が指定される。例えば、各分割ファイルに含まれる最大の行数として100行を指定して、1000行のデータを含むファイルを分割する場合、10個の分割ファイルが生成される。
各分割ファイルに含まれる最大の行数を指定してファイルが分割される場合、各行が可変長であるため、ファイルの先頭から逐次的に改行を探索し、指定された行数に相当する改行が検出される毎に、分割位置が決定される。また、各分割ファイルに含まれる最大のバイト長を指定してファイルが分割される場合、ファイルの先頭から指定されたバイト長毎に分割位置が決定される。
しかし、splitコマンドでは、レコードが固定バイト長または固定行数の場合を除き、レコード単位で分割された分割ファイルを生成することができず、少なくとも一部のレコードが途中で分断されたデータを含む分割ファイルが生成される可能性がある。そのため、複数の可変長レコードで構成されるファイルを分割する場合にも、レコード単位のデータを含む分割ファイルを生成できる新たな機能の実現が必要とされる。
また、ゲノム解析のような膨大な量のデータを扱う場合には、複数の分割ファイルを、複数の実行ユニット(例えば、複数のプロセッサ、複数のプロセッサ・コア等)によって並列に処理できることが望ましい。
そのため、本ストレージシステム1は、ファイルの分割処理を並列分散化し、レコード境界でアライメントされた分割ファイルを生成するように構成される。つまり、ストレージシステム1において並列分散化して実行される複数の処理の各々で、レコード境界でアライメントされた分割ファイルを生成する。
図3および図4は、ストレージシステム1によって、ファイルから、分割ファイルとして用いられ得るデータ部分が決定される例を示す。ファイルは、特定のフォーマットに従うレコードが一つ以上含まれているデータのまとまりであれば、どのような形態のものであってもよい。この特定のフォーマットは、単一のフォーマットであり、一つのファイルには複数種のフォーマットに基づくレコードは混在しない。ファイルは、例えば、ファイル名(ファイルパス)によって特定することができる。
ファイル内の、分割ファイルとして用いられ得るデータ部分(部分バイト列)は、ファイルがレコード境界で分割された一つ以上のレコードを含むデータであり、アラインドチャンクとも称する。アラインドチャンクに含まれる各レコードは、レコードの途中で分断されていない完全なレコードである。アラインドチャンクは、分割ファイルとしてストレージに格納することもできるし、メモリ上に展開されたデータとして任意の処理を施すこともできる。
図3は、ファイル5をN個の分割ファイルに分割する場合に、ファイル5から、i番目の分割ファイルとして用いられ得るアラインドチャンクが決定される例を示す。なお、iは、N個の分割ファイルに対して、ファイル5内での順序に応じて先頭から付与される番号であり、1からNまでのいずれかの値を取る。また、i番目の分割ファイルには、ファイル5内のi番目のアラインドチャンクが含まれる。
図3に示すように、ファイル5に含まれるデータに対して、i番目の分割ファイル(i番目のアラインドチャンク)を取得するためのi番目の仮のチャンク511(チャンク#i)が設定される。このi番目の仮のチャンク511は、分割される総数Nに基づいてファイル5が均等に分割された場合のi番目のデータ部分(部分バイト列)に相当する。
より具体的には、i番目の仮のチャンク511の開始位置511S(startChunk#i)は、下記の式(1)を用いて算出される。
startChunk#i=(ファイルサイズ/N)×(i−1) 式(1)
開始位置511Sは、ファイル5に含まれるバイト列における、仮のチャンク511の先頭のバイトの位置を示す。
また、i番目の仮のチャンク511の終了位置511E(endChunk#i)は、i<Nの場合、下記の式(2)を用いて、またi=Nの場合、下記の式(3)を用いて算出される。
endChunk#i=(ファイルサイズ/N)×i−1 式(2)
endChunk#i=ファイルサイズ−1 式(3)
終了位置511Eは、ファイル5に含まれるバイト列における、仮のチャンク511の終端のバイトの位置を示す。ファイルサイズの単位は、例えば、バイトである。ファイル5が分割される総数Nは、分割ファイル数や並列化される処理の数(例えば、実行ユニット数、スレッド数)等に応じて、ユーザが任意に設定できる。また、(ファイルサイズ/N)の値は、小数点以下が切り捨てられる。
このように、仮のチャンク511のサイズ、すなわち、開始位置511Sから終了位置511Eまでのバイト列のサイズは、ファイル5が分割される総数Nに基づいて決定される。仮のチャンク511の開始位置511Sおよび終了位置511Eは、ファイル5からアラインドチャンクを取得するための基準の位置として用いられる。ここでは、ファイル5内の位置がバイト単位の位置として扱われる例を示すが、他の単位に基づいてファイル5内の位置を扱うこともできる。
図3に示すように、i番目の仮のチャンク511の開始位置511Sはレコード521(レコードx)の途中に位置し、また終了位置511Eはレコード523(レコードy)の途中に位置している。したがって、分割される総数Nに基づいてファイル5が均等に分割された場合には、途中で分断されたレコードを含むデータ(ここでは、レコード521の途中からレコード523の途中までのデータ)で構成される分割ファイルが生成される可能性がある。
そのため本実施形態では、i番目の仮のチャンク511を用いて、レコード境界で分割された、一つ以上のレコードを含むデータであるi番目のアラインドチャンク551(アラインドチャンク#i)を算出する。アラインドチャンク551に含まれる各レコードは、途中で分断されていない、特定のフォーマットに従った完全なレコードである。
より具体的には、仮のチャンク511の開始位置511S以降にある最初のレコード先頭バイトの位置が、アラインドチャンク551の開始位置551S(startFirstRecord#i)として算出される。換言すると、アラインドチャンク551の開始位置551Sは、仮のチャンク511の開始位置511S以降にある最初の完全なレコード522(レコード(x+1))の開始位置である。
また、仮のチャンク511の終了位置511E以降にある最初のレコード終了バイトの位置が、アラインドチャンク551の終了位置551E(endLastRecord#i)として算出される。換言すると、アラインドチャンク551の終了位置551Eは、仮のチャンク511の終了位置511Eに存在しているレコード523(レコードy)の終了位置である。
以上により、開始位置551Sと終了位置551Eとで特定されるi番目のアラインドチャンク551を取得することができる。i番目のアラインドチャンク551には、レコード522からレコード523までのレコードが含まれている。
次いで、図4は(i+1)番目のアラインドチャンク552が決定される例を示す。図3に示した例と同様にして、ファイル5に含まれるデータに対して、(i+1)番目の分割ファイル((i+1)番目のアラインドチャンク)を取得するための(i+1)番目の仮のチャンク512(チャンク#(i+1))が設定される。この(i+1)番目の仮のチャンク512は、分割される総数Nに基づいてファイル5が均等に分割された場合の(i+1)番目のデータ部分に相当する。
(i+1)番目の仮のチャンク512の開始位置512S(startChunk#(i+1))および終了位置512E(endChunk#(i+1))は、上述した式(1)から式(3)を用いて算出される。そして、(i+1)番目の仮のチャンク512の開始位置512S以降にある最初のレコード先頭バイトの位置が、(i+1)番目のアラインドチャンク552の開始位置552S(startFirstRecord#(i+1))として算出される。換言すると、アラインドチャンク552の開始位置552Sは、仮のチャンク512の開始位置512S以降にある最初の完全なレコード524(レコード(y+1))の開始位置である。
また、(i+1)番目の仮のチャンク512の終了位置512E以降にある最初のレコード終了バイトの位置が、(i+1)番目のアラインドチャンク552の終了位置552E(endLastRecord#(i+1))として算出される。換言すると、アラインドチャンク552の終了位置552Eは、仮のチャンク512の終了位置512Eに存在しているレコード525(レコードz)の終了位置である。
これにより、開始位置552Sと終了位置552Eとで特定される(i+1)番目のアラインドチャンク552を取得することができる。(i+1)番目のアラインドチャンク552には、レコード524からレコード525までのレコードが含まれている。
図3および図4を参照して例示したように、ファイル5と、ファイル5を分割する総数Nと、アラインドチャンクの番号i(あるいは、分割ファイルの番号i)とが特定されているならば、そのファイル5からi番目のアラインドチャンク(分割ファイル)を取得することができる。つまり、ファイル5内のあるアラインドチャンクを取得するための処理は、ファイル5内のその他のアラインドチャンクを取得するための処理の過程や結果に依存しない。したがって、ファイル5に含まれる複数のアラインドチャンクは、それぞれ並列に決定することができる。そのため、例えば、複数のCU20は、各々に割り当てられた番号iのアラインドチャンクを並列分散化して算出することができる。
図5は、ストレージシステム1によって実行されるチャンクアライメントモジュール61の機能構成を示す。チャンクアライメントモジュール61は、例えば、プログラムモジュールであり、アラインドチャンクを取得するための命令群を含む。チャンクアライメントモジュール61内の命令群は、例えば、CU20のCPU21によって実行される。
チャンクアライメントモジュール61は、ファイル入力部611、チャンク先頭レコード開始位置算出部612、およびチャンク最終レコード終了位置算出部613を備える。ファイル入力部611は、指定されたファイルに含まれるデータの少なくとも一部をストレージから読み出す。ストレージは、例えば、いずれかのNM30内のNAND型フラッシュメモリ32である。ファイルは、特定のフォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される。ファイル入力部611は、このファイルに含まれるバイト列の少なくとも一部を読み出す。読み出されたバイト列は、例えば、CU20のRAM22内に確保されたバッファ領域に格納される。
チャンク先頭レコード開始位置算出部612は、ファイル内の第1ファイル位置以降にある最初のレコード開始位置を、アラインドチャンクの開始位置として算出する。このレコード開始位置は、ファイル内の第1ファイル位置か、それより後にある最初のレコード先頭バイトの位置である。レコード先頭バイトの位置は、一つのレコードを構成するバイト列の先頭のバイトのアドレスを示す。なお、ファイルに含まれるデータがバイト以外の別の単位で扱われる場合には、位置(アドレス)もその単位に応じて表現され得る。
チャンク最終レコード終了位置算出部613は、ファイル内の、第1ファイル位置よりも後の第2ファイル位置以降にある最初のレコード終了位置を、アラインドチャンクの終了位置として算出する。このレコード終了位置は、ファイル内の第2ファイル位置か、それより後にある最初のレコード終了バイトの位置である。レコード終了バイトの位置は、一つのレコードを構成するバイト列の終端のバイトのアドレスを示す。
より具体的には、まず、ファイル入力部611は、第1ファイル位置を先頭とする、指定されたサイズの第1データ(バイト列)をファイルから読み込む。第1データのサイズは、アラインドチャンクの開始位置が検出可能なサイズであればよく、例えば、レコードの最大サイズの2倍である。レコードの最大サイズの2倍のバイト列が読み込まれることにより、そのバイト列に少なくとも一つのレコードの先頭位置が含まれるので、アラインドチャンクの開始位置となるレコード先頭位置を確実に検出することができる。
そして、チャンク先頭レコード開始位置算出部612は、読み込まれた第1データの先頭からレコード開始位置を探索し、最初に見つかったレコード開始位置を、アラインドチャンクの開始位置として算出する。なお、最初に見つかったレコード開始位置が、第1データの先頭からの相対的な位置を示す場合には、第1ファイル位置に、その最初に見つかったレコード開始位置を加えた値が、ファイルに含まれるデータ(バイト列)の先頭を基準とした、アラインドチャンクの開始位置として算出される。
また、ファイル入力部611は、第2ファイル位置を先頭とする、指定されたサイズの第2データ(バイト列)をファイルから読み込む。第2データのサイズは、例えば、レコードの最大サイズの2倍である。チャンク最終レコード終了位置算出部613は、読み込まれた第2データの先頭からレコード終了位置を探索し、最初に見つかったレコード終了位置を、アラインドチャンクの終了位置として算出する。なお、最初に見つかったレコード終了位置が、第2データの先頭からの相対的な位置を示す場合には、第2ファイル位置に、その最初に見つかったレコード終了位置を加えた値が、ファイルに含まれるデータ(バイト列)の先頭を基準とした、アラインドチャンクの終了位置として算出される。
図6および図7を参照して、チャンクアライメントモジュール61によって、i番目のアラインドチャンクの開始位置と終了位置とが決定される場合の具体的な動作の例を説明する。
図6は、i番目のアラインドチャンクの開始位置を決定するときに、i番目の仮のチャンク511の開始位置511S(第1ファイル位置)を先頭とする、指定されたサイズの第1バイト列511Aがファイル5からバッファに読み込まれる場合を示している。チャンク先頭レコード開始位置算出部612は、第1バイト列511Aの先頭からレコード開始位置を探索する。
第1バイト列511Aの先頭にあるレコード521(レコードx)は、その途中から第1バイト列511Aに含まれている。したがって、このレコード521のレコード開始位置は第1バイト列511Aに含まれていない。そのため、レコード521に後続するレコード522(レコード(x+1))のレコード開始位置が、i番目のアラインドチャンク551の開始位置551Sとして算出される。つまり、第1バイト列511Aを先頭から探索した場合に最初に見つかる完全なレコード522の開始位置が、i番目のアラインドチャンク551の開始位置551Sとして算出される。
次いで、図7は、i番目のアラインドチャンクの終了位置を決定するときに、(i+1)番目の仮のチャンク512の開始位置512Sを先頭とする、指定されたサイズの第2バイト列511Bがファイル5からバッファに読み込まれる場合を示している。チャンク最終レコード終了位置算出部613は、第2バイト列511Bの先頭からレコード開始位置を探索する。
第2バイト列511Bの先頭にあるレコード523(レコードy)は、その途中から第2バイト列511Bに含まれている。したがって、このレコード523のレコード開始位置は第2バイト列511Bに含まれていない。そのため、レコード523に後続するレコード524(レコード(y+1))のレコード開始位置が、(i+1)番目のアラインドチャンク552の開始位置552Sとして算出される。つまり、第2バイト列511Bを先頭から探索した場合に最初に見つかる完全なレコード524の開始位置が、(i+1)番目のアラインドチャンク552の開始位置552Sとして算出される。
そして、チャンク最終レコード終了位置算出部613は、(i+1)番目のアラインドチャンク552の開始位置552Sから1を引いた値を、i番目のアラインドチャンク551の終了位置551Eとして算出する。
以上により、チャンクアライメントモジュール61は、算出された開始位置551Sと終了位置551Eとで特定されるアラインドチャンクをファイル5から取得することができる。
また、図8は、ストレージシステム1によって実行される分割ファイル生成モジュール62の機能構成を示す。分割ファイル生成モジュール62は、例えば、プログラムモジュールであり、分割ファイルを生成するための命令群を含む。分割ファイル生成モジュール62内の命令群は、例えば、CU20のCPU21によって実行される。
分割ファイル生成モジュール62は、チャンクアライメントモジュール61と、分割ファイル出力部621とを備える。チャンクアライメントモジュール61は、上述した通り、ファイル5から一つのアラインドチャンクを取得する。分割ファイル出力部621は、取得されたアラインドチャンクを分割ファイルとして出力する。分割ファイル出力部621は、アラインドチャンクを含む分割ファイルをストレージ(例えば、いずれかのNM30内のNAND型フラッシュメモリ32)に格納してもよい。分割ファイル出力部621は、ファイル5内の、アラインドチャンクの開始位置から終了位置までのバイト列を含む分割ファイルをストレージに書き込む。
なお、本ストレージシステム1は、ファイル5から複数のアラインドチャンク(分割ファイル)を取得する処理を、アラインドチャンク毎に並列に行うことができる。
図9は、ストレージシステム1によって実行される並列分散処理プログラム6Aの機能構成の例を示す。この並列分散処理プログラム6Aは、ファイル5から複数のアラインドチャンク(分割ファイル)を並列に取得するための命令群を含む。並列分散処理プログラム6A内の命令群は、例えば、複数のCU20に設けられる複数のCPU21にそれぞれタスクを割り当てることによって並列に実行される。つまり、複数のCU20が、並列処理のための複数の実行ユニットとして用いられる。この場合、いずれかのCU20が、タスクの割り当てのためのスケジューラ機能を有していてもよい。また、各CPU21は、複数のプロセッサ・コアを備えるマルチコアCPUであってもよい。マルチコアCPUを備える一つのCU20は、複数のタスクが割り当てられても性能が劣化しない。そのため、1つのCPU21に複数のタスクを割り当ててもよい。各実行ユニットは、割り当てられたタスク(命令群)を実行可能な処理装置であり、例えば、プロセッサやプロセッサ・コアのような各種の回路(処理回路)によって実現され得る。
並列分散処理プログラム6Aは、複数の分割ファイル生成モジュール62−1,62−2,……,62−Nと、複数のファイル処理モジュール63−1,63−2,……,63−Nとを備える。各分割ファイル生成モジュール62−1,62−2,……,62−Nは、図8を参照して上述した分割ファイル生成モジュール62と同様に動作し、ファイル5から一つの分割ファイルを生成する。
各分割ファイル生成モジュール62−1,62−2,……,62−N内のチャンクアライメントモジュール61により算出されるアラインドチャンクの開始位置および終了位置は、複数のCU20を用いて並列に算出される。例えば、分割ファイル生成モジュール62−1内のチャンクアライメントモジュール61により算出されるアラインドチャンクの開始位置および終了位置と、別の分割ファイル生成モジュール62−2内のチャンクアライメントモジュール61により算出されるアラインドチャンクの開始位置および終了位置とは、複数のCU20を用いて並列に算出される。あるいは、分割ファイル生成モジュール62−1内のチャンクアライメントモジュール61により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置と、別の分割ファイル生成モジュール62−2内のチャンクアライメントモジュール61により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置とは、複数のCU20を用いて並列に算出されてもよい。
各ファイル処理モジュール63−1,63−2,……,63−Nは、関連付けられたいずれかの分割ファイル生成モジュール62−1,62−2,……,62−Nによって出力された分割ファイルを処理する。より詳しくは、ファイル処理モジュール63−1は、分割ファイル生成モジュール62−1によってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。ファイル処理モジュール63−2は、分割ファイル生成モジュール62−2によってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。また、ファイル処理モジュール63−Nは、分割ファイル生成モジュール62−Nによってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。この任意の処理には、例えば、ゲノム解析、顧客情報や購入履歴情報のような種々の産業データ(ビッグデータ)の検索、保守、解析等が含まれる。
なお、互いに関連付けられた分割ファイル生成モジュール62−1,62−2,……,62−Nとファイル処理モジュール63−1,63−2,……,63−Nとが、異なるCU20を用いて実行されてもよい。例えば、分割ファイル生成モジュール62−1(チャンクアライメントモジュール61)によるアラインドチャンクの開始位置および終了位置の算出処理が、第1のCU20を用いて行われ、ファイル処理モジュール63−1による分割ファイルの処理が、第2のCU20を用いて行われてもよい。この場合、第1のCU20は、分割ファイルのファイル名を第2のCU20に通知(送信)してもよい。
図10のフローチャートを参照して、図9の機能構成を有するストレージシステム1によって実行されるファイル分割処理の手順を説明する。ストレージシステム1に設けられる複数のCU20は、一つのファイルが分割されたN個の分割ファイルをそれぞれ生成するためのN個の処理を並列に実行することができる。ここでは、一つ以上のCU20によって、N個の分割ファイルの内のi番目の分割ファイルが生成される場合を例示する。
まず、CU20は、ファイル5内のi番目のチャンクの開始位置と終了位置とを算出する(ステップS101)。これら開始位置と終了位置とは、ファイル5のサイズと、ファイル5が分割される数Nとを用いて算出される。そして、CU20は、ファイル5内の、i番目のチャンクの開始位置を先頭とする最大レコードサイズの2倍のデータを読み込む(ステップS102)。CU20は、読み込まれたデータを用いて、i番目のアラインドチャンクのチャンク先頭レコード開始位置を算出する(ステップS103)。
また、CU20は、ファイル5内の、算出された終了位置の一つ後の位置を先頭とする最大レコードサイズの2倍のデータを読み込む(ステップS104)。CU20は、(i+1)番目のアラインドチャンクのチャンク先頭レコード開始位置を算出する(ステップS105)。そして、CU20は、(i+1)番目のアラインドチャンクのチャンク先頭レコード開始位置に基づいて、i番目のアラインドチャンクのチャンク最終レコード終了位置を算出する(ステップS106)。i番目のアラインドチャンクのチャンク最終レコード終了位置は、例えば、(i+1)番目のアラインドチャンクのチャンク先頭レコード開始位置の一つ前の位置である。
なお、ステップS102からステップS103までの手順とステップS104からステップS106までの手順とは、並列に実行されてもよい。つまり、i番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とは、複数のCU20(実行ユニット)を用いて並列に算出されてもよい。また、ステップS102からステップS103までの手順の後に、ステップS104からステップS106までの手順が実行されてもよいし、あるいはステップS104からステップS106までの手順の後にステップS102からステップS103までの手順が実行されてもよい。
CU20は、算出されたi番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とに基づいて、ファイル5内のi番目のアラインドチャンクを特定し、i番目のアラインドチャンクを含む分割ファイルをストレージに格納する(ステップS107)。CU20は、例えば、いずれかのNM30内のNAND型フラッシュメモリ32に分割ファイルを書き込むためのコマンドを発行することにより、分割ファイルをデータ記憶領域40に格納する。
次いで、CU20は、ストレージに格納された分割ファイルを読み出す(ステップS108)。そして、CU20は、読み出された分割ファイルを処理する(ステップS109)。CU20は、この分割ファイルに任意の処理を施すことができる。
以上のファイル分割処理により、CU20は、ファイル5内のi番目のアラインドチャンクを含む分割ファイルをストレージに格納し、当該分割ファイルに任意の処理を施すことができる。なお、N番目のアラインドチャンク(すなわち、ファイル5の最後のアラインドチャンク)を算出する場合には、ステップS104からステップS106までの手順が、ファイル5の最後の位置(ファイルサイズ−1)を、N番目のアラインドチャンクのチャンク最終レコード終了位置として算出する手順に置き換えられる。
また、複数のCU20は、上述したファイル分割処理を複数並列に実行することにより、1番目からN番目までの分割ファイルを並列に生成および処理することができる。
また、図11は、ストレージシステム1によって実行される並列分散処理プログラム6Bの機能構成の別の例を示す。この並列分散処理プログラム6Bは、ファイル5から複数のアラインドチャンクを並列に取得し、処理するための命令群を含む。並列分散処理プログラム6B内の命令群は、例えば、複数のCU20に設けられる複数のCPU21にそれぞれタスクを割り当てることによって並列に実行される。その場合、いずれかのCU20が、タスクの割り当てのためのスケジューラ機能を有していてもよい。また、各CPU21は、マルチコアCPUであってもよい。マルチコアCPUを備える一つのCU20は、複数のタスクが割り当てられても性能が劣化しない。そのため、1つのCPU21に複数のタスクを割り当ててもよい。
並列分散処理プログラム6Bは、複数のチャンクアライメントモジュール61−1,61−2,……,61−Nと、複数のファイル処理モジュール64−1,64−2,……,64−Nとを備える。各チャンクアライメントモジュール61−1,61−2,……,61−Nは、図5を参照して上述したチャンクアライメントモジュール61と同様に動作し、ファイル5から一つのアラインドチャンクを生成する。
各チャンクアライメントモジュール61−1,61−2,……,61−Nにより算出されるアラインドチャンクの開始位置および終了位置は、複数のCU20を用いて並列に算出される。例えば、チャンクアライメントモジュール61−1により算出されるアラインドチャンクの開始位置および終了位置と、別のチャンクアライメントモジュール61−2により算出されるアラインドチャンクの開始位置および終了位置とは、複数のCU20を用いて並列に算出される。あるいは、チャンクアライメントモジュール61−1により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置と、別のチャンクアライメントモジュール61−2により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置とは、複数のCU20を用いて並列に算出される。
各ファイル処理モジュール64−1,64−2,……,64−Nは、関連付けられたいずれかのチャンクアライメントモジュール61−1,61−2,……,61−Nによって出力されたアラインドチャンクを処理する。より詳しくは、ファイル処理モジュール64−1は、チャンクアライメントモジュール61−1によって出力された、ファイル5内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。ファイル処理モジュール64−2は、チャンクアライメントモジュール61−2によって出力された、ファイル5内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。また、ファイル処理モジュール64−Nは、チャンクアライメントモジュール61−Nによって出力された、ファイル5内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。この任意の処理には、例えば、ゲノム解析、顧客情報や購入履歴情報のような種々の産業データの検索、保守、解析等が含まれる。
なお、互いに関連付けられたチャンクアライメントモジュール61−1,61−2,……,61−Nとファイル処理モジュール64−1,64−2,……,64−Nとが、異なるCU20を用いて実行されてもよい。例えば、チャンクアライメントモジュール61−1によるアラインドチャンクの開始位置および終了位置の算出処理が、第1のCU20を用いて行われ、関連付けられたファイル処理モジュール64−1によるアラインドチャンクの開始位置から終了位置までのバイト列の処理が、第2のCU20を用いて行われてもよい。この場合、第1のCU20はアラインドチャンクの開始位置から終了位置までのバイト列を第2のCU20に送信してもよいし、アラインドチャンクの開始位置と終了位置とを示す情報を第2のCU20に送信してもよい。
図12のフローチャートを参照して、図11の機能構成を有するストレージシステム1によって実行されるファイル分割処理の手順を説明する。ストレージシステム1に設けられる複数のCU20は、一つのファイルが分割されたN個のアラインドチャンクをそれぞれ生成するためのN個の処理を並列に実行することができる。ここでは、一つ以上のCU20によって、N個のアラインドチャンクの内のi番目のアラインドチャンクが生成される場合を例示する。
ステップS201からステップS206までの手順は、図10を参照して上述したステップS101からステップS106までの手順と同様である。
CU20は、算出されたi番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とに基づいて、ファイル5内のi番目のアラインドチャンクを特定し、i番目のアラインドチャンクを処理する(ステップS207)。CU20は、このアラインドチャンクに任意の処理を施すことができる。
以上のファイル分割処理により、CU20は、ファイル5内のi番目のアラインドチャンクを特定し、このアラインドチャンクに任意の処理を施すことができる。このように、アラインドチャンクをストレージに格納することなく、そのまま処理することもできる。また、複数のCU20は、上述したファイル分割処理を複数並列に実行することにより、1番目からN番目までのアラインドチャンクを並列に生成および処理することができる。
次いで、ファイル5内のレコードがエンコードされるフォーマットがFASTQフォーマットである場合について具体的に例示する。
FASTQフォーマットのレコード構造は以下のように定義される。
@title and optional description
sequence line(s)
+optional repeat of title line
quality line(s)
このように、FASTQフォーマットの一つのレコードは、四つのタイプの行(line)を含む。この行は、上述したフォーマットのレコード構造を規定するフィールドに相当する。各タイプの行は、以下の特徴を有する。
(1)@title and optional description: ‘@’から始まり、レコードの識別子となるタイトルを含み、任意の注釈やコメントを含み得る行である。長さが制限されていない自由なフォーマットのフィールドである。以下、タイトルラインとも称する。
(2)sequence line(s): 一行以上のシーケンスラインに、DNAやRNAの塩基配列を表す一つ以上の文字が含まれる。タブやスペースのような余白は許されない。
(3)+optional repeat of title line: ‘+’から始まり、シーケンスラインの終了とクオリティラインの開始とを表す。この行には、‘+’だけが含まれていてもよいし、‘+’の後に、(1)のタイトルラインにおける‘@’より後の記述が含まれていてもよい。以下、プラスラインとも称する。
(4)quality line(s): 一行以上のクオリティラインに、DNAやRNAの塩基配列のクオリティスコアを表す一つ以上の文字が含まれる。この一つ以上の文字には、‘@’も含まれ得る。
なお、シーケンスラインに含まれる文字列の長さ(文字数)と、クオリティラインに含まれる文字列の長さ(文字数)は同じである。つまり、シーケンスラインのバイト長とクオリティラインのバイト長は等しい。
一つのファイルには、一つ以上のレコードが含まれる。図13は、FASTQフォーマットのレコードを含むファイルの例を示す。ファイル71は、FASTQフォーマットに従ってそれぞれエンコードされた複数の可変長レコード711,712,713で構成されている。
先頭のレコード711において、一番目の行は、‘@’から始まり、タイトル(識別子)である“SEQ_ID1”が続くタイトルラインである。二番目の行は、塩基配列を表す文字列を含むシーケンスラインである。三番目の行は‘+’から始まるプラスラインである。四番目の行は、クオリティスコアを表す文字列を含むクオリティラインである。
シーケンスラインの塩基配列を表す文字列と、クオリティラインのクオリティスコアを表す文字列とは、先頭から順にそれぞれ対応している。レコード711では、例えば、シーケンスラインの先頭の文字‘G’と、クオリティラインの先頭の文字‘!’とが対応している。すなわち、塩基配列‘G’のクオリティスコアが‘!’であることが示されている。このような関係を有しているため、シーケンスラインに含まれる文字列の長さ(バイト長)と、クオリティラインに含まれる文字列の長さ(バイト長)とは同一になる。
後続する他のレコード712,713も同様に、FASTQフォーマットに従った構造を有している。
図14および図15を参照して、FASTQフォーマットのファイルからアラインドチャンクが算出される処理について説明する。
図14のフローチャートは、CU20によって実行される、アラインドチャンクの開始位置を算出するための処理の手順を示す。CU20は、例えば、チャンク先頭レコード開始位置算出部612に含まれる命令群を実行することにより、アラインドチャンクの開始位置を算出する。
ここでは、この命令群が、アラインドチャンクの開始位置を探索するための関数SearchFirstRecordOfChunkとして実現される場合を例示する。CU20は、この関数を実行する(呼び出す)ことにより、ファイル内の、アラインドチャンクの開始位置を取得することができる。この関数の引数は、入力ファイル(inFile)と、チャンク開始位置(startChunk)と、最大レコードサイズ(maxRecordSize)である。入力ファイルは、分割対象のファイルである。チャンク開始位置は、入力ファイルが、分割される総数Nに基づいて均等に分割される場合の仮のチャンクの開始位置である。最大レコードサイズは、ファイルに含まれるレコードの最大のサイズであり、例えば、バイト単位で指定される。
なお、この処理では、以下のように規定される関数が用いられる。
(1)Read(f,s,m): ファイルfの先頭sバイト目から最大mバイトをバッファに読み込み、バッファを返す。データが読み込めない場合、NULLを返す。
(2)SearchCandidateHeader(buf,p): バッファbufの先頭からpバイト目以降で、最初に見つかった文字‘@’で始まる行の行頭位置を返す。文字‘@’で始まる行が見つからなければNULLを返す。
(3)NextLine(buf,p): バッファbufの先頭pバイト目以降で最初に見つかった改行文字のバイト位置+1を返す。改行文字が見つからなければNULLを返す。
(4)SearchCandidateDelimiter(buf,p,t): バッファbufの先頭からpバイト目以降で、最初に見つかった文字‘+’で始まる行の行頭の、バッファbufの先頭からのバイト位置をxとする。文字‘+’で始まる行が見つかり、且つバッファbufの先頭(x+1)バイト目が改行文字、またはバッファbufの先頭(x+1)バイト目から最初の改行までの文字列とバッファbufの先頭からtバイト目から最初の改行までの文字列とが一致する場合は、xを返す。それ以外の場合はNULLを返す。
上記の関数を用いる、アラインドチャンクの開始位置を算出するための処理の手順を説明する。
まず、CU20は、Read関数を用いて、アラインドチャンクの開始位置を検出するために必要なデータ(バイト列)をファイルからバッファbufに読み込み、バッファbufの先頭文字の位置(アドレス)を変数pに設定し、バッファbufの最終文字の位置(アドレス)を変数eに設定する(ステップS301)。Read関数には、引数として、入力ファイル(inFile)と、チャンク開始位置(startChunk)と、最大レコードサイズの2倍の値(2*maxRecordSize)とが指定されている。バッファbufに最大レコードサイズの2倍のバイト列が読み込まれることにより、そのバイト列に少なくとも一つのレコードの先頭位置が含まれるので、アラインドチャンクの開始位置となるレコードの先頭位置を確実に検出することができる。
CU20は、バッファbufがNULLであるか否かを判定する(ステップS302)。バッファbufがNULLである場合(ステップS302のYES)、ステップS311に進み、エラーを示す値(ここでは、−1)を返す。これは、ファイルから、規定されたフォーマットの構造を有するレコードを検出できなかったことを意味する。
バッファbufがNULLでない場合(ステップS302のNO)、CU20は、SearchCandidateHeader関数を用いて、バッファbufに含まれるバイト列から、レコードの先頭の行の行頭位置の候補を変数p1に代入する(ステップS303)。SearchCandidateHeader関数には、引数として、バッファbufと、バッファの先頭文字のアドレスpとが指定されている。バッファbufの先頭からpバイト目以降に文字‘@’で始まる行が存在する場合、変数p1には、先頭からpバイト目以降で、文字‘@’で始まる最も前方の行の行頭位置が設定される。つまり、変数p1には、タイトルラインの行頭位置の候補が設定される。一方、バッファbufの先頭からpバイト目以降に文字‘@’で始まる行が存在しない場合、変数p1にはNULLが設定される。
CU20は、変数p1がNULLであるか否かを判定する(ステップS304)。変数p1がNULLである場合(ステップS304のYES)、ステップS311に進み、−1を返す。
変数p1がNULLでない場合(ステップS304のNO)、CU20は、NextLine関数を用いて、変数p1の位置から始まる行の次の行の行頭位置を変数p2に設定する(ステップS305)。NextLine関数には、バッファbufと、‘@’で始まる行の行頭位置が設定された変数p1とが指定されている。バッファbufの先頭からp1バイト目以降に改行文字が存在する場合、変数p2には、p1バイト目以降で、最も前方の改行文字に1を加えた値が設定される。つまり、変数p2には、シーケンスラインの行頭位置の候補が設定される。一方、バッファbufの先頭からp1バイト目以降に改行文字が存在しない場合、変数p2にはNULLが設定される。
CU20は、変数p2がNULLであるか否かを判定する(ステップS306)。変数p2がNULLである場合(ステップS306のYES)、ステップS311に進み、−1を返す。
変数p2がNULLでない場合(ステップS306のNO)、CU20は、SearchCandidateDelimiter関数を用いて、変数p2の位置以降で、文字‘+’で始まる行の行頭位置を変数p3に設定する(ステップS307)。なお、文字‘+’で始まる行の行頭位置の次の文字が改行文字である場合、あるいは、文字‘+’で始まる行の行頭位置の次の文字から最初の改行文字までの文字列と、バッファbufの先頭からtバイト目から最初の改行までの文字列とが一致する場合に、文字‘+’で始まる行の行頭位置が変数p3に設定される。つまり、変数p3には、プラスラインの行頭位置の候補が設定される。これ以外の場合は、変数p3にはNULLが設定される。
CU20は、変数p3がNULLであるか否かを判定する(ステップS308)。変数p3がNULLである場合(ステップS308のYES)、ステップS311に進み、−1を返す。
変数p3がNULLでない場合(ステップS308のNO)、CU20は、NextLine関数を用いて、変数p3の位置から始まる行の次の行の行頭位置を変数p4に設定し、変数p3と変数p2との差を変数Lに設定する(ステップS309)。NextLine関数には、バッファbufと、‘+’で始まる行の行頭位置が設定された変数p3とが指定されている。バッファbufの先頭からp3バイト目以降に改行文字が存在する場合、変数p4には、p3バイト目以降で、最も前方の改行文字に1を加えた値が設定される。つまり、変数p4には、クオリティラインの先頭位置の候補が設定される。一方、バッファbufの先頭からp3バイト目以降に改行文字が存在しない場合、変数p4にはNULLが設定される。また、変数Lには、プラスラインの先頭位置の候補から、シーケンスラインの先頭位置の候補を引いた差、すなわち、シーケンスラインに含まれる文字列の長さ(バイト長)が設定される。
次いで、CU20は、変数p4に変数Lを加えた値が変数e以上であるか否かを判定する(ステップS310)。つまり、CU20は、クオリティラインの先頭位置p4に、シーケンスラインに含まれる文字列の長さLを加えた値が、バッファbufの最終文字のアドレスe以上であるか否かを判定する。変数p4に変数Lを加えた値が変数e以上である場合(ステップS310のYES)、バッファbuf内に、シーケンスラインと同一の長さを有する適切なクオリティラインが含まれていないので、ステップS311に進み、−1を返す。
変数p4に変数Lを加えた値が変数e未満である場合(ステップS310のNO)、CU20は、変数p4に変数Lを加えた値から1を引いた値が変数eと等しいか、あるいはバッファbuf内の(p4+L)バイト目の文字が‘@’であるかを判定する(ステップS312)。変数p4に変数Lを加えた値から1を引いた値が変数eと等しいことは、クオリティラインの最終位置が、バッファbufの最終文字のアドレスと一致していることを示す。また、バッファbuf内の(p4+L)バイト目の文字が‘@’であることは、クオリティラインの最終位置の次の位置に、次のレコードのタイトルラインの先頭と推定される文字‘@’が存在することを示す。したがって、変数p4に変数Lを加えた値から1を引いた値が変数eと等しいか、バッファbuf内の(p4+L)バイト目の文字が‘@’であるかの少なくともいずれかである場合には、バッファbuf内のp1バイト目から(p4+L−1)バイト目までのバイト列が一つのレコードに対応すると云える。
変数p4に変数Lを加えた値から1を引いた値が変数eと等しいか、バッファbuf内の(p4+L)バイト目の文字が‘@’であるかの少なくともいずれかである場合(ステップS312のYES)、CU20は、タイトルラインの先頭位置を示す変数p1からバッファbufの先頭文字の位置を引いた値を、引数startChunkに加えた値を返す(ステップS313)。
変数p4に変数Lを加えた値から1を引いた値が変数eとは異なり、且つバッファbuf内の(p4+L)バイト目の文字が‘@’ではない場合(ステップS312のNO)、CU20は、変数pに、変数p2の値を設定し(ステップS314)、ステップS302に戻る。これにより、バッファbuf内の変数p2で示される位置から、再度、アラインドチャンクの先頭位置を探索するための処理が行われる。
以上により、指定された入力ファイル(inFile)内の、指定された位置(startChunk)か、それより後にある最初のレコード開始位置を、アラインドチャンクの開始位置として算出することができる。また、アラインドチャンクの開始位置が算出できない場合には、エラーを示す値(例えば、−1)を出力することもできるので、例えば、FASTQフォーマットに従っていない入力ファイルが誤って指定されたこと等を検出することができる。
また、図15のフローチャートは、アラインドチャンクの終了位置を算出するための処理の手順を示す。CU20は、例えば、チャンク最終レコード終了位置算出部613に含まれる命令群を実行することにより、アラインドチャンクの終了位置を算出する。
ここでは、この命令群が、アラインドチャンクの終了位置を探索するための関数SearchLastRecordOfChunkとして実現される場合を例示する。CU20は、この関数を実行する(呼び出す)ことにより、ファイル内の、アラインドチャンクの終了位置を取得することができる。この関数の引数は、入力ファイル(inFile)と、チャンク終了位置(endChunk)と、最大レコードサイズ(maxRecordSize)である。入力ファイルは、分割対象のファイルである。チャンク終了位置は、入力ファイルが、分割される総数Nに基づいて均等に分割される場合のチャンクの終了位置である。最大レコードサイズは、ファイルに含まれるレコードの最大のサイズであり、例えば、バイト単位で指定される。なお、この処理では、図14を参照して上述したSearchFirstRecordOfChunk関数が用いられる。
CU20は、SearchFirstRecordOfChunk関数を用いて、入力ファイルinFile内の、チャンク終了位置endChunkより後に存在するアラインドチャンクのチャンク開始位置を算出し、算出されたチャンク開始位置を変数pに設定する(ステップS401)。このチャンク開始位置は、チャンク終了位置を算出しようとしているアラインドチャンクに後続するアラインドチャンクの開始位置である。SearchFirstRecordOfChunk関数は、この後続するアラインドチャンクの開始位置が算出された場合には、その開始位置を返し、算出されなかった場合には、エラーを示す値(ここでは、−1)を返す。
CU20は、変数pが−1と等しいか否かを判定する(ステップS402)。つまり、CU20は、変数pに基づいて、後続するアラインドチャンクの開始位置が算出できたか否かを判定する。変数pが−1と等しい場合(ステップS402のYES)、すなわち、後続するアラインドチャンクの開始位置が算出できなかった場合、CU20は、チャンク終了位置endChunkを、アラインドチャンクのチャンク終了位置として返す(ステップS403)。
一方、変数pが−1でない場合(ステップS402のNO)、すなわち、後続するアラインドチャンクの開始位置が算出できた場合、CU20は、変数pから1を引いた値を返す(ステップS404)。つまり、後続するアラインドチャンクの開始位置の一つ前の位置が、アラインドチャンクのチャンク終了位置として返される。
以上により、指定された入力ファイル(inFile)内の、指定された位置(endChunk)か、それより後にある最初のレコード終了位置を、アラインドチャンクの終了位置として算出することができる。
(第2実施形態)
第1実施形態では、ストレージシステム1に設けられる複数のCU20を用いて、一つのファイルを分割した複数の分割ファイル(アラインドチャンク)が並列に生成される。これに対して、第2実施形態では、複数の実行ユニット(例えば、複数のプロセッサ・コア)を用いて、一つのファイルを分割した複数の分割ファイル(アラインドチャンク)が並列に生成される。
第2実施形態に係る電子機器によって実行されるプログラム(プログラムモジュール)の機能構成は、第1実施形態のストレージシステム1によって実行されるプログラムモジュールの機能構成と同様であり、第2実施形態と第1実施形態とでは、プログラムモジュールを実行するシステム構成のみが異なる。以下、第1実施形態と異なる点のみを説明する。
第2実施形態の電子機器は、パーソナルコンピュータ、サーバコンピュータ、または各種電子機器に内蔵される組み込みシステムとして実現され得る。以下では、この電子機器が、サーバコンピュータ8として実現される場合を例示する。
図16に示すように、サーバコンピュータ8は、CPU81、システムコントローラ82、主メモリ83、グラフィクスプロセッシングユニット(GPU)84、ビデオメモリ(VRAM)84A、BIOS−ROM85、不揮発性メモリ86、ネットワークコントローラ87、エンベデッドコントローラ(EC)88等を備える。
CPU81は、サーバコンピュータ8内の様々なコンポーネントの動作を制御するプロセッサである。CPU81は、ストレージデバイスである不揮発性メモリ86から主メモリ83にロードされる様々なプログラムを実行する。これらプログラムには、オペレーティングシステム(OS)83A、及び様々なアプリケーションプログラムが含まれている。アプリケーションプログラムには、並列分散処理プログラム83Bが含まれている。この並列分散処理プログラム83Bは、一つのファイルから複数の分割ファイル(または複数のアラインドチャンク)を並列に生成するための命令群、複数の分割ファイル(または複数のアラインドチャンク)を並列に処理するための命令群、等を含む。並列分散処理プログラム83Bは、図9を参照して上述した並列分散処理プログラム6Aの機能構成を有していてもよいし、図11を参照して上述した並列分散処理プログラム6Bの機能構成を有していてもよい。
また、CPU81は、BIOS−ROM85に格納された基本入出力システム(BIOS)も実行する。BIOSは、ハードウェア制御のためのプログラムである。
システムコントローラ82は、CPU101のローカルバスと各種コンポーネントとの間を接続するデバイスである。システムコントローラ82には、主メモリ83をアクセス制御するメモリコントローラも内蔵されている。また、システムコントローラ82は、PCI EXPRESS規格のシリアルバスなどを介してグラフィクスプロセッシングユニット(GPU)84との通信を実行する機能も有している。
GPU84は、サーバコンピュータ8に接続されるディスプレイを制御する表示コントローラである。このGPU84によって生成される表示信号はディスプレイに送られる。
また、GPU84は、表示信号の生成のようなグラフィックス処理以外の汎用的な演算も行うことができる。GPU84は、例えば、複数のプロセッサ・コア92−1,92−2,92−Nを備える。GPU84によってマルチスレッド化されたプログラムが実行される場合、スケジューラ91は、そのプログラムに対応する処理が分割された複数のスレッドを複数のプロセッサ・コア92−1,92−2,92−Nに割り当てる。このスレッドは、複数のプロセッサ・コア92−1,92−2,92−Nのそれぞれに割り当てられる処理単位である。各プロセッサ・コア92−1,92−2,92−Nは、割り当てられたスレッドを処理する実行ユニットである。複数のプロセッサ・コア92−1,92−2,92−Nを備えるGPU84では、割り当てられた複数のスレッドを並列に動作させることができる。並列分散処理プログラム83Bは、GPU84によって、ファイル分割のための処理が分割された複数のスレッドが並列に動作するマルチスレッド処理として実行され得る。
ネットワークコントローラ87は、有線または無線通信を実行するように構成されたデバイスである。ネットワークコントローラ87は、信号を送信する送信部と、信号を受信する受信部とを含む。このネットワークコントローラ87を介して、分割対象のファイルを受信してもよいし、一つのファイルを分割して得られた分割ファイルやアラインドチャンクを、別の電子機器に送信してもよい。
EC88は、電力管理のためのエンベデッドコントローラを含むワンチップマイクロコンピュータである。EC88は、ユーザによるパワーボタンの操作に応じて本サーバコンピュータ8を電源オン又は電源オフする機能を有している。
このようなサーバコンピュータ8の構成でも、第1実施形態と同様に、複数のプロセッサ・コア92−1,92−2,92−Nを用いて、ファイル5から複数のアラインドチャンク(または分割ファイル)を並列に取得および処理することができる。
以上説明したように、第1および第2実施形態によれば、ファイルを効率的に分割することができる。ファイル入力部611は、第1フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成されるファイル5から、当該ファイル5に含まれるバイト列の少なくとも一部を読み出す。チャンク先頭レコード開始位置算出部612は、第1フォーマットに基づいて、ファイル5内の第1ファイル位置以降にある最初のレコード先頭バイトの位置である第1チャンク開始位置を算出する。チャンク最終レコード終了位置算出部613は、第1フォーマットに基づいて、ファイル5内の、第1ファイル位置よりも後の第2ファイル位置以降にある最初のレコード終了バイトの位置である第1チャンク終了位置を算出する。
これにより、算出された第1チャンク開始位置と第1チャンク終了位置とを用いて、ファイル5から、レコード境界でアライメントされたアラインドチャンクを取得することができる。ファイル5内のあるアラインドチャンクを取得するために、第1チャンク開始位置と第1チャンク終了位置とを算出する処理は、ファイル5内のその他のアラインドチャンクを取得するために、それらアラインドチャンクの各々の開始位置と終了位置とを算出する処理の過程や結果に依存しない。したがって、ファイル5に含まれる複数のアラインドチャンクは、それぞれ並列に決定することができ、ファイルを効率的に分割することができる。ファイル分割の並列分散処理が可能であることによって、ファイル5が分割される総数Nが増加するほど、ファイル5から分割ファイル群を生成するために要する時間を短くすることができる。
また、第1および第2実施形態に記載された様々な機能の各々は、回路(処理回路)によって実現されてもよい。処理回路の例には、中央処理装置(CPU)のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム(命令群)を実行することによって、記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。これら実施形態に記載されたCPU以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
また、第1および第2実施形態の各種処理はコンピュータプログラムによって実現することができるので、このコンピュータプログラムを格納したコンピュータ読み取り可能な記憶媒体を通じてこのコンピュータプログラムをコンピュータにインストールして実行するだけで、これら実施形態と同様の効果を容易に実現することができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。