(57)【要約】【課題】  ファイルを効率的に分割できる電子機器を実現する。【解決手段】  実施形態によれば、電子機器は、ファイル入力部と、第１開始位置算出部と、第１終了位置算出部とを具備する。ファイル入力部は、第１フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される第１ファイルから、当該第１ファイルに含まれるバイト列の少なくとも一部を読み出す。第１開始位置算出部は、前記第１フォーマットに基づいて、前記第１ファイル内の第１ファイル位置以降にある最初のレコード先頭バイトの位置である第１チャンク開始位置を算出する。第１終了位置算出部は、前記第１フォーマットに基づいて、前記第１ファイル内の、前記第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了バイトの位置である第１チャンク終了位置を算出する。【選択図】図３
2019101450.tif 000002
【特許請求の範囲】
【請求項１】
第１フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される第１ファイルから、当該第１ファイルに含まれるバイト列の少なくとも一部を読み出すファイル入力部と、
前記第１フォーマットに基づいて、前記第１ファイル内の第１ファイル位置以降にある最初のレコード先頭バイトの位置である第１チャンク開始位置を算出する第１開始位置算出部と、
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了バイトの位置である第１チャンク終了位置を算出する第１終了位置算出部とを具備する電子機器。
【請求項２】
前記第１ファイル内の前記第１チャンク開始位置から前記第１チャンク終了位置までのバイト列を含む第２ファイルをストレージに書き込むファイル出力部をさらに具備する請求項１記載の電子機器。
【請求項３】
前記第１フォーマットは、ＦＡＳＴＱファイルフォーマットである請求項１または請求項２記載の電子機器。
【請求項４】
前記第２ファイルを読み出し、前記読み出された第２ファイルに第１処理を施す第１処理部をさらに具備する請求項２記載の電子機器。
【請求項５】
前記第１ファイル内の前記第１チャンク開始位置から前記第１チャンク終了位置までのバイト列に第１処理を施す第１処理部をさらに具備する請求項１記載の電子機器。
【請求項６】
前記第１ファイル位置から前記第２ファイル位置までのバイト列のサイズは、前記第１ファイルが分割される数に基づいて決定される請求項１記載の電子機器。
【請求項７】
前記ファイル入力部は、前記第１ファイル位置を先頭とする第１サイズの第１バイト列を前記第１ファイルから読み出し、
前記第１開始位置算出部は、前記第１バイト列の最初のレコード先頭バイトの位置を、前記第１チャンク開始位置として算出し、
前記ファイル入力部は、前記第２ファイル位置の次のバイト位置である第３ファイル位置を先頭とする前記第１サイズの第２バイト列を、前記第１ファイルから読み出し、
前記第１終了位置算出部は、前記第２バイト列の最初のレコード先頭バイトの一つ前のバイト位置を、前記第１チャンク終了位置として算出する請求項１記載の電子機器。
【請求項８】
複数の実行ユニットをさらに具備し、
前記第１チャンク開始位置と前記第１チャンク終了位置とは、前記複数の実行ユニットを用いて並列に算出される請求項１記載の電子機器。
【請求項９】
複数の実行ユニットをさらに具備し、
前記第１チャンク開始位置および前記第１チャンク終了位置を、前記複数の実行ユニットの内の第１実行ユニットを用いて算出し、
前記第１ファイル内の、前記第１チャンク開始位置から前記第１チャンク終了位置までのバイト列が、前記複数の実行ユニットの内の第２実行ユニットを用いて処理される請求項１記載の電子機器。
【請求項１０】
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第２ファイル位置よりも後の第３ファイル位置以降にある最初のレコード先頭バイトの位置である第２チャンク開始位置を算出する第２開始位置算出部と、
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第３ファイル位置よりも後の第４ファイル位置以降にある最初のレコード終了バイトの位置である第２チャンク終了位置を算出する第２終了位置算出部とをさらに具備する請求項１記載の電子機器。
【請求項１１】
複数の実行ユニットをさらに具備し、
前記第１チャンク開始位置および前記第１チャンク終了位置と、前記第２チャンク開始位置および前記第２チャンク終了位置とは、前記複数の実行ユニットを用いて並列に算出される請求項１０記載の電子機器。
【請求項１２】
複数の実行ユニットをさらに具備し、
前記第１チャンク開始位置と、前記第１チャンク終了位置と、前記第２チャンク開始位置と、前記第２チャンク終了位置とは、前記複数の実行ユニットを用いて並列に算出される請求項１０記載の電子機器。
【請求項１３】
電子機器によって実行されるファイル管理方法であって、
第１フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される第１ファイルから、当該第１ファイルに含まれるバイト列の少なくとも一部を読み出すことと、
前記第１フォーマットに基づいて、前記第１ファイル内の第１ファイル位置以降にある最初のレコード先頭バイトの位置である第１チャンク開始位置を算出することと、
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了バイトの位置である第１チャンク終了位置を算出することとを具備するファイル管理方法。
【請求項１４】
前記第１ファイル内の前記第１チャンク開始位置から前記第１チャンク終了位置までのバイト列を含む第２ファイルをストレージに書き込むことをさらに具備する請求項１３記載のファイル管理方法。
【請求項１５】
前記第１フォーマットは、ＦＡＳＴＱファイルフォーマットである請求項１３または請求項１４記載のファイル管理方法。
【請求項１６】
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第２ファイル位置よりも後の第３ファイル位置以降にある最初のレコード先頭バイトの位置である第２チャンク開始位置を算出することと、
前記第１フォーマットに基づいて、前記第１ファイル内の、前記第３ファイル位置よりも後の第４ファイル位置以降にある最初のレコード終了バイトの位置である第２チャンク終了位置を算出することとをさらに具備する請求項１３記載のファイル管理方法。
【請求項１７】
前記電子機器は複数の実行ユニットを備え、
前記第１チャンク開始位置および前記第１チャンク終了位置と、前記第２チャンク開始位置および前記第２チャンク終了位置とは、前記複数の実行ユニットを用いて並列に算出される請求項１６記載のファイル管理方法。
【請求項１８】
前記電子機器は複数の実行ユニットを備え、
前記第１チャンク開始位置と、前記第１チャンク終了位置と、前記第２チャンク開始位置と、前記第２チャンク終了位置とは、前記複数の実行ユニットを用いて並列に算出される請求項１６記載のファイル管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ファイルを分割する技術に関する。
【背景技術】
【０００２】
一つのファイルを、サイズがより小さい複数のファイルに分割するファイル分割技術が利用されている。例えば、Ｌｉｎｕｘ（登録商標）のｓｐｌｉｔコマンドを用いる場合、入力されたファイルが、そのファイルの先頭から指定された行数毎に分割されることにより、複数の分割ファイルが生成される。指定された行数毎にファイルを分割する場合、各行は可変長であるため、ファイルの先頭から逐次的に改行を探索しながら、当該ファイルの分割位置が決定される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１６−２１８７０１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ファイルの分割位置がファイルの先頭から逐次的に探索される場合、大きなサイズを有するファイルでは、全ての分割ファイルの生成が完了するまでに膨大な時間を要する可能性がある。
【０００５】
本発明が解決しようとする課題は、ファイルを効率的に分割できる電子機器およびファイル管理方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、電子機器は、ファイル入力部と、第１開始位置算出部と、第１終了位置算出部とを具備する。ファイル入力部は、第１フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される第１ファイルから、当該第１ファイルに含まれるバイト列の少なくとも一部を読み出す。第１開始位置算出部は、前記第１フォーマットに基づいて、前記第１ファイル内の第１ファイル位置以降にある最初のレコード先頭バイトの位置である第１チャンク開始位置を算出する。第１終了位置算出部は、前記第１フォーマットに基づいて、前記第１ファイル内の、前記第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了バイトの位置である第１チャンク終了位置を算出する。
【図面の簡単な説明】
【０００７】
【図１】第１実施形態に係る電子機器のシステム構成の例を示すブロック図。
【図２】第１実施形態の電子機器に設けられるノードモジュール（ＮＭ）の構成を示すブロック図。
【図３】第１実施形態の電子機器によってアラインドチャンクが検出される例を示す図。
【図４】第１実施形態の電子機器によってアラインドチャンクが検出される別の例を示す図。
【図５】第１実施形態の電子機器によって実行されるチャンクアライメントモジュールの機能構成を示すブロック図。
【図６】第１実施形態の電子機器によってアラインドチャンクの開始位置が算出される例を示す図。
【図７】第１実施形態の電子機器によってアラインドチャンクの終了位置が算出される例を示す図。
【図８】第１実施形態の電子機器によって実行される分割ファイル生成モジュールの機能構成を示すブロック図。
【図９】第１実施形態の電子機器によって実行される並列分散処理プログラムの機能構成の例を示すブロック図。
【図１０】第１実施形態の電子機器によって実行されるファイル分割処理の手順の例を示すフローチャート。
【図１１】第１実施形態の電子機器によって実行される並列分散処理プログラムの機能構成の別の例を示すブロック図。
【図１２】第１実施形態の電子機器によって実行されるファイル分割処理の手順の別の例を示すフローチャート。
【図１３】第１実施形態の電子機器によって分割されるＦＡＳＴＱフォーマットのレコードを含むファイルの例を示す図。
【図１４】第１実施形態の電子機器によって実行されるチャンク先頭レコード開始位置算出処理の手順の例を示すフローチャート。
【図１５】第１実施形態の電子機器によって実行されるチャンク最終レコード終了位置算出処理の手順の例を示すフローチャート。
【図１６】第２実施形態の電子機器のシステム構成の例を示すブロック図。
【発明を実施するための形態】
【０００８】
以下、実施の形態について図面を参照して説明する。
（第１実施形態）  
まず、第１実施形態について説明する。  
【０００９】
図１は、本実施形態の電子機器のシステム構成の例を示す。この電子機器は、例えば、ストレージシステム１として実現され得る。このストレージシステム１は、例えば、ネットワーク経由で接続されるクライアント装置２からの要求に応じて、データの書き込み、データの読み出し、データの更新、データの削除などを実行するファイルサーバとして機能する。図１に示すように、ストレージシステム１は、ネットワークスイッチ１０、複数のコネクションユニット（ＣＵ）２０、および複数のノードモジュール（ＮＭ）３０を備えている。
【００１０】
ＮＭ３０は、ノードコントローラ（ＮＣ）３１と、一つ以上のＮＡＮＤ型フラッシュメモリ３２とを有している。ＮＣ３１は、ＮＡＮＤ型フラッシュメモリ３２に対するアクセス制御と、データの転送制御とを実行する。ＮＣ３１は、例えば４系統の入出力ポートを有しており、ＮＣ３１同士を接続することにより、複数のＮＭ３０を、例えばマトリックス状に相互に接続することができる。複数のＮＭ３０を相互に接続することにより、ストレージシステム１は、大容量のデータ記憶領域４０を論理的に構築する。
【００１１】
ＣＵ２０は、クライアント装置２からの要求に応じて、前述のように構築されたデータ記憶領域４０に対するデータの入出力処理（データの更新、データの削除を含む）を実行する。より詳細には、クライアント装置２からの要求に対応する、複数のＮＭ３０の中の目的のＮＭ３０に対してデータの入出力命令を発行する。以下、ＣＵ２０からＮＭ３０へ発行されるデータの入出力命令を、コマンドと称することがある。
【００１２】
ＣＵ２０は、ＣＰＵ２１、ＲＡＭ２２およびＮＭインタフェース２３を有している。ＣＵ２０の各機能は、ＲＡＭ２２に格納され、ＣＰＵ２１によって実行されるプログラムにより実現される。ＮＭインタフェース２３は、ＮＭ３０、より詳細には、ＮＣ３１との間の通信を実行する。ＮＭインタフェース２３は、複数のＮＭ３０の中のいずれか１つのＮＭ３０のＮＣ３１と接続されている。つまり、ＣＵ２０は、ＮＭインタフェース２３を介して、複数のＮＭ３０の中のいずれか１つのＮＭ３０と直接的に接続され、ＮＭ３０のＮＣ３１を介して、その他のＮＭ３０と間接的に接続される。ＣＵ２０と直接的に接続されるＮＭ３０は、ＣＵ２０毎に異なっている。
【００１３】
前述したように、ＣＵ２０は、複数のＮＭ３０の中のいずれか一つのＮＭ３０と直接的に接続される。したがって、ＣＵ２０が、直接的に接続されるＮＭ３０以外のＮＭ３０に対してデータの入出力命令を発行する場合においても、その入出力命令は、まず、直接的に接続されるＮＭ３０へ転送される。その後、その入出力命令は、各ＮＭ３０のＮＣ３１を介して目的のＮＭ３０まで転送される。
【００１４】
例えば、ＮＭ３０がマトリックス状に相互に接続される場合、行番号と列番号との組合せで各ＮＭ３０に識別子（Ｍ，Ｎ）が付されるものと想定すると、ＮＣ３１は、自ＮＭ３０の識別子と、入出力命令の送り先として指定される識別子とを比較することにより、第１に、その入出力命令が自ＮＭ３０宛てか否かを判断できる。自ＮＭ３０宛てでない場合、ＮＣ３１は、自ＮＭ３０の識別子と、入出力命令の送り先として指定される識別子との関係、より詳細には、行番号、列番号それぞれの大小関係から、第２に、隣接するＮＭ３０の中のいずれのＮＭ３０へ転送すべきかを判断できる。入出力命令を目的のＮＭ３０まで転送する手法については、特定の手法に限定されるものではなく、既知のいずれの手法も採用し得る。本来であれば転送先として選ばれることがないＮＭ３０への経路も、予備経路として使用され得る。
【００１５】
また、ＮＭ３０による、入出力命令に応じた入出力処理の結果、すなわち、ＮＡＮＤ型フラッシュメモリ３２に対するアクセスの結果も、前述した入出力命令の転送と同様、ＮＣ３１の働きにより、他のＮＭ３０をいくつか経由して入出力命令の発行元であるＣＵ２０まで転送される。例えば、入出力命令の発行元の情報として、ＣＵ２０が直接的に接続されるＮＭ３０の識別子を含ませることで、この識別子を処理結果の転送先として指定することができる。
【００１６】
さらに、ＮＣ３１は、割り込み要求信号を転送するための入出力ポートを別途例えば４系統有しており、前述した入出力命令および処理結果と同様、ＮＭ３０からＣＵ２０までの割り込み要求信号の転送経路が動的に決定される。
【００１７】
ネットワークスイッチ１０は、クライアント装置２からの要求を受け付け、その要求を複数のＣＵ２０のいずれかに転送する。典型的には、ネットワークスイッチ１０は、複数のＣＵ２０の負荷が均等となるように、クライアント装置２からの要求を複数のＣＵ２０へ振り分ける。なお、ここでは、ネットワークスイッチ１０を設ける例を示しているが、複数のＣＵ２０の中の１つのＣＵ２０がマスタとして動作して、ネットワークスイッチ１０の役割を担ってもよい。ネットワークスイッチ１０は、ＣＵ２０から受領した処理結果をクライアント装置２へ返送する。
【００１８】
図２は、ＮＭ３０の構成（ＮＣ３１の詳細な構成）の一例を示す図である。
【００１９】
前述したように、ＮＭ３０は、ＮＣ３１と、一つ以上のＮＡＮＤ型フラッシュメモリ３２とを有している。ＮＣ３１は、図２に示されるように、ＣＰＵ３１１、ＲＡＭ３１２、Ｉ／Ｏコントローラ３１３およびＮＡＮＤインタフェース３１４を有している。ＮＣ３１の各機能は、ＲＡＭ３１２に格納され、ＣＰＵ３１１によって実行されるプログラムにより実現される。Ｉ／Ｏコントローラ３１３は、ＣＵ２０（より詳細には、ＮＭインタフェース２３）または他のＮＭ３０（より詳細には、ＮＣ３１）との間の通信を実行する。ＮＡＮＤインタフェース３１４は、ＮＡＮＤ型フラッシュメモリ３２に対するアクセスを実行する。
【００２０】
本ストレージシステム１は、一つのファイルを、サイズがより小さい複数のファイル（以下、分割ファイルとも称する）に分割するファイル分割機能を有している。例えば、複数のＣＵ２０は、一つのファイルを分割することにより得られる複数の分割ファイルのそれぞれを、並列に生成することができる。
【００２１】
ファイルは、特定のフォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される。フォーマットは、一つ以上のフィールドを含むレコード構造と、各フィールドに設定可能なデータに関する種々の規則とを規定する。この規則には、データの形式（例えば、文字、数字、記号、余白等）、文字数（バイト長）、行数、特定の位置に配置すべきデータ、フィールド間の関係、等が規定され得る。特定の位置に配置すべきデータの規則は、例えば、行頭／行末に特定の文字を配置することを規定する。フィールド間の関係の規則は、例えば、第１フィールドに含まれる文字数と第２フィールドに含まれる文字数とが同一であることを規定する。したがって、ファイルを構成する一つのレコードは、その特定のフォーマットで規定された一つ以上のフィールドで構成されるデータのまとまりである。各フィールドのバイト長や行数は可変とすることができ、そのようなフィールドを含むレコードを可変長レコードと称する。フォーマットにはさらに、一つのレコードの最大サイズ（最大のバイト長）が規定されていてもよい。
【００２２】
レコードがエンコードされるフォーマットには、任意のフォーマットを用いることができ、例えば、バイト長と行数とが可変であるレコード構造を有していてもよい。このフォーマットは、例えば、ゲノム解析に用いられるＦＡＳＴＱフォーマットである。また、改行またはファイル最終文字（ＥＯＦなど）で終端する任意のＡＳＣＩＩ文字の可変長バイト列をレコードフォーマットとすることも可能である。この場合、任意のテキストファイルを本発明で扱うことができる。
【００２３】
ところで、ファイルを複数の分割ファイルに分割するＬｉｎｕｘのｓｐｌｉｔコマンドでは、各分割ファイルに含まれる最大の行数や、各分割ファイルに含まれる最大のバイト長が指定される。例えば、各分割ファイルに含まれる最大の行数として１００行を指定して、１０００行のデータを含むファイルを分割する場合、１０個の分割ファイルが生成される。
【００２４】
各分割ファイルに含まれる最大の行数を指定してファイルが分割される場合、各行が可変長であるため、ファイルの先頭から逐次的に改行を探索し、指定された行数に相当する改行が検出される毎に、分割位置が決定される。また、各分割ファイルに含まれる最大のバイト長を指定してファイルが分割される場合、ファイルの先頭から指定されたバイト長毎に分割位置が決定される。
【００２５】
しかし、ｓｐｌｉｔコマンドでは、レコードが固定バイト長または固定行数の場合を除き、レコード単位で分割された分割ファイルを生成することができず、少なくとも一部のレコードが途中で分断されたデータを含む分割ファイルが生成される可能性がある。そのため、複数の可変長レコードで構成されるファイルを分割する場合にも、レコード単位のデータを含む分割ファイルを生成できる新たな機能の実現が必要とされる。
【００２６】
また、ゲノム解析のような膨大な量のデータを扱う場合には、複数の分割ファイルを、複数の実行ユニット（例えば、複数のプロセッサ、複数のプロセッサ・コア等）によって並列に処理できることが望ましい。
【００２７】
そのため、本ストレージシステム１は、ファイルの分割処理を並列分散化し、レコード境界でアライメントされた分割ファイルを生成するように構成される。つまり、ストレージシステム１において並列分散化して実行される複数の処理の各々で、レコード境界でアライメントされた分割ファイルを生成する。
【００２８】
図３および図４は、ストレージシステム１によって、ファイルから、分割ファイルとして用いられ得るデータ部分が決定される例を示す。ファイルは、特定のフォーマットに従うレコードが一つ以上含まれているデータのまとまりであれば、どのような形態のものであってもよい。この特定のフォーマットは、単一のフォーマットであり、一つのファイルには複数種のフォーマットに基づくレコードは混在しない。ファイルは、例えば、ファイル名（ファイルパス）によって特定することができる。
【００２９】
ファイル内の、分割ファイルとして用いられ得るデータ部分（部分バイト列）は、ファイルがレコード境界で分割された一つ以上のレコードを含むデータであり、アラインドチャンクとも称する。アラインドチャンクに含まれる各レコードは、レコードの途中で分断されていない完全なレコードである。アラインドチャンクは、分割ファイルとしてストレージに格納することもできるし、メモリ上に展開されたデータとして任意の処理を施すこともできる。
【００３０】
図３は、ファイル５をＮ個の分割ファイルに分割する場合に、ファイル５から、ｉ番目の分割ファイルとして用いられ得るアラインドチャンクが決定される例を示す。なお、ｉは、Ｎ個の分割ファイルに対して、ファイル５内での順序に応じて先頭から付与される番号であり、１からＮまでのいずれかの値を取る。また、ｉ番目の分割ファイルには、ファイル５内のｉ番目のアラインドチャンクが含まれる。
【００３１】
図３に示すように、ファイル５に含まれるデータに対して、ｉ番目の分割ファイル（ｉ番目のアラインドチャンク）を取得するためのｉ番目の仮のチャンク５１１（チャンク＃ｉ）が設定される。このｉ番目の仮のチャンク５１１は、分割される総数Ｎに基づいてファイル５が均等に分割された場合のｉ番目のデータ部分（部分バイト列）に相当する。
【００３２】
より具体的には、ｉ番目の仮のチャンク５１１の開始位置５１１Ｓ（ｓｔａｒｔＣｈｕｎｋ＃ｉ）は、下記の式（１）を用いて算出される。  
【００３３】
ｓｔａｒｔＣｈｕｎｋ＃ｉ＝（ファイルサイズ／Ｎ）×（ｉ−１）  式（１）  
開始位置５１１Ｓは、ファイル５に含まれるバイト列における、仮のチャンク５１１の先頭のバイトの位置を示す。  
また、ｉ番目の仮のチャンク５１１の終了位置５１１Ｅ（ｅｎｄＣｈｕｎｋ＃ｉ）は、ｉ＜Ｎの場合、下記の式（２）を用いて、またｉ＝Ｎの場合、下記の式（３）を用いて算出される。  
【００３４】
ｅｎｄＣｈｕｎｋ＃ｉ＝（ファイルサイズ／Ｎ）×ｉ−１          式（２）  
ｅｎｄＣｈｕｎｋ＃ｉ＝ファイルサイズ−１                      式（３）  
終了位置５１１Ｅは、ファイル５に含まれるバイト列における、仮のチャンク５１１の終端のバイトの位置を示す。ファイルサイズの単位は、例えば、バイトである。ファイル５が分割される総数Ｎは、分割ファイル数や並列化される処理の数（例えば、実行ユニット数、スレッド数）等に応じて、ユーザが任意に設定できる。また、（ファイルサイズ／Ｎ）の値は、小数点以下が切り捨てられる。
【００３５】
このように、仮のチャンク５１１のサイズ、すなわち、開始位置５１１Ｓから終了位置５１１Ｅまでのバイト列のサイズは、ファイル５が分割される総数Ｎに基づいて決定される。仮のチャンク５１１の開始位置５１１Ｓおよび終了位置５１１Ｅは、ファイル５からアラインドチャンクを取得するための基準の位置として用いられる。ここでは、ファイル５内の位置がバイト単位の位置として扱われる例を示すが、他の単位に基づいてファイル５内の位置を扱うこともできる。
【００３６】
図３に示すように、ｉ番目の仮のチャンク５１１の開始位置５１１Ｓはレコード５２１（レコードｘ）の途中に位置し、また終了位置５１１Ｅはレコード５２３（レコードｙ）の途中に位置している。したがって、分割される総数Ｎに基づいてファイル５が均等に分割された場合には、途中で分断されたレコードを含むデータ（ここでは、レコード５２１の途中からレコード５２３の途中までのデータ）で構成される分割ファイルが生成される可能性がある。
【００３７】
そのため本実施形態では、ｉ番目の仮のチャンク５１１を用いて、レコード境界で分割された、一つ以上のレコードを含むデータであるｉ番目のアラインドチャンク５５１（アラインドチャンク＃ｉ）を算出する。アラインドチャンク５５１に含まれる各レコードは、途中で分断されていない、特定のフォーマットに従った完全なレコードである。
【００３８】
より具体的には、仮のチャンク５１１の開始位置５１１Ｓ以降にある最初のレコード先頭バイトの位置が、アラインドチャンク５５１の開始位置５５１Ｓ（ｓｔａｒｔＦｉｒｓｔＲｅｃｏｒｄ＃ｉ）として算出される。換言すると、アラインドチャンク５５１の開始位置５５１Ｓは、仮のチャンク５１１の開始位置５１１Ｓ以降にある最初の完全なレコード５２２（レコード（ｘ＋１））の開始位置である。
【００３９】
また、仮のチャンク５１１の終了位置５１１Ｅ以降にある最初のレコード終了バイトの位置が、アラインドチャンク５５１の終了位置５５１Ｅ（ｅｎｄＬａｓｔＲｅｃｏｒｄ＃ｉ）として算出される。換言すると、アラインドチャンク５５１の終了位置５５１Ｅは、仮のチャンク５１１の終了位置５１１Ｅに存在しているレコード５２３（レコードｙ）の終了位置である。
【００４０】
以上により、開始位置５５１Ｓと終了位置５５１Ｅとで特定されるｉ番目のアラインドチャンク５５１を取得することができる。ｉ番目のアラインドチャンク５５１には、レコード５２２からレコード５２３までのレコードが含まれている。
【００４１】
次いで、図４は（ｉ＋１）番目のアラインドチャンク５５２が決定される例を示す。図３に示した例と同様にして、ファイル５に含まれるデータに対して、（ｉ＋１）番目の分割ファイル（（ｉ＋１）番目のアラインドチャンク）を取得するための（ｉ＋１）番目の仮のチャンク５１２（チャンク＃（ｉ＋１））が設定される。この（ｉ＋１）番目の仮のチャンク５１２は、分割される総数Ｎに基づいてファイル５が均等に分割された場合の（ｉ＋１）番目のデータ部分に相当する。
【００４２】
（ｉ＋１）番目の仮のチャンク５１２の開始位置５１２Ｓ（ｓｔａｒｔＣｈｕｎｋ＃（ｉ＋１））および終了位置５１２Ｅ（ｅｎｄＣｈｕｎｋ＃（ｉ＋１））は、上述した式（１）から式（３）を用いて算出される。そして、（ｉ＋１）番目の仮のチャンク５１２の開始位置５１２Ｓ以降にある最初のレコード先頭バイトの位置が、（ｉ＋１）番目のアラインドチャンク５５２の開始位置５５２Ｓ（ｓｔａｒｔＦｉｒｓｔＲｅｃｏｒｄ＃（ｉ＋１））として算出される。換言すると、アラインドチャンク５５２の開始位置５５２Ｓは、仮のチャンク５１２の開始位置５１２Ｓ以降にある最初の完全なレコード５２４（レコード（ｙ＋１））の開始位置である。
【００４３】
また、（ｉ＋１）番目の仮のチャンク５１２の終了位置５１２Ｅ以降にある最初のレコード終了バイトの位置が、（ｉ＋１）番目のアラインドチャンク５５２の終了位置５５２Ｅ（ｅｎｄＬａｓｔＲｅｃｏｒｄ＃（ｉ＋１））として算出される。換言すると、アラインドチャンク５５２の終了位置５５２Ｅは、仮のチャンク５１２の終了位置５１２Ｅに存在しているレコード５２５（レコードｚ）の終了位置である。
【００４４】
これにより、開始位置５５２Ｓと終了位置５５２Ｅとで特定される（ｉ＋１）番目のアラインドチャンク５５２を取得することができる。（ｉ＋１）番目のアラインドチャンク５５２には、レコード５２４からレコード５２５までのレコードが含まれている。
【００４５】
図３および図４を参照して例示したように、ファイル５と、ファイル５を分割する総数Ｎと、アラインドチャンクの番号ｉ（あるいは、分割ファイルの番号ｉ）とが特定されているならば、そのファイル５からｉ番目のアラインドチャンク（分割ファイル）を取得することができる。つまり、ファイル５内のあるアラインドチャンクを取得するための処理は、ファイル５内のその他のアラインドチャンクを取得するための処理の過程や結果に依存しない。したがって、ファイル５に含まれる複数のアラインドチャンクは、それぞれ並列に決定することができる。そのため、例えば、複数のＣＵ２０は、各々に割り当てられた番号ｉのアラインドチャンクを並列分散化して算出することができる。
【００４６】
図５は、ストレージシステム１によって実行されるチャンクアライメントモジュール６１の機能構成を示す。チャンクアライメントモジュール６１は、例えば、プログラムモジュールであり、アラインドチャンクを取得するための命令群を含む。チャンクアライメントモジュール６１内の命令群は、例えば、ＣＵ２０のＣＰＵ２１によって実行される。
【００４７】
チャンクアライメントモジュール６１は、ファイル入力部６１１、チャンク先頭レコード開始位置算出部６１２、およびチャンク最終レコード終了位置算出部６１３を備える。ファイル入力部６１１は、指定されたファイルに含まれるデータの少なくとも一部をストレージから読み出す。ストレージは、例えば、いずれかのＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２である。ファイルは、特定のフォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成される。ファイル入力部６１１は、このファイルに含まれるバイト列の少なくとも一部を読み出す。読み出されたバイト列は、例えば、ＣＵ２０のＲＡＭ２２内に確保されたバッファ領域に格納される。
【００４８】
チャンク先頭レコード開始位置算出部６１２は、ファイル内の第１ファイル位置以降にある最初のレコード開始位置を、アラインドチャンクの開始位置として算出する。このレコード開始位置は、ファイル内の第１ファイル位置か、それより後にある最初のレコード先頭バイトの位置である。レコード先頭バイトの位置は、一つのレコードを構成するバイト列の先頭のバイトのアドレスを示す。なお、ファイルに含まれるデータがバイト以外の別の単位で扱われる場合には、位置（アドレス）もその単位に応じて表現され得る。
【００４９】
チャンク最終レコード終了位置算出部６１３は、ファイル内の、第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了位置を、アラインドチャンクの終了位置として算出する。このレコード終了位置は、ファイル内の第２ファイル位置か、それより後にある最初のレコード終了バイトの位置である。レコード終了バイトの位置は、一つのレコードを構成するバイト列の終端のバイトのアドレスを示す。
【００５０】
より具体的には、まず、ファイル入力部６１１は、第１ファイル位置を先頭とする、指定されたサイズの第１データ（バイト列）をファイルから読み込む。第１データのサイズは、アラインドチャンクの開始位置が検出可能なサイズであればよく、例えば、レコードの最大サイズの２倍である。レコードの最大サイズの２倍のバイト列が読み込まれることにより、そのバイト列に少なくとも一つのレコードの先頭位置が含まれるので、アラインドチャンクの開始位置となるレコード先頭位置を確実に検出することができる。
【００５１】
そして、チャンク先頭レコード開始位置算出部６１２は、読み込まれた第１データの先頭からレコード開始位置を探索し、最初に見つかったレコード開始位置を、アラインドチャンクの開始位置として算出する。なお、最初に見つかったレコード開始位置が、第１データの先頭からの相対的な位置を示す場合には、第１ファイル位置に、その最初に見つかったレコード開始位置を加えた値が、ファイルに含まれるデータ（バイト列）の先頭を基準とした、アラインドチャンクの開始位置として算出される。
【００５２】
また、ファイル入力部６１１は、第２ファイル位置を先頭とする、指定されたサイズの第２データ（バイト列）をファイルから読み込む。第２データのサイズは、例えば、レコードの最大サイズの２倍である。チャンク最終レコード終了位置算出部６１３は、読み込まれた第２データの先頭からレコード終了位置を探索し、最初に見つかったレコード終了位置を、アラインドチャンクの終了位置として算出する。なお、最初に見つかったレコード終了位置が、第２データの先頭からの相対的な位置を示す場合には、第２ファイル位置に、その最初に見つかったレコード終了位置を加えた値が、ファイルに含まれるデータ（バイト列）の先頭を基準とした、アラインドチャンクの終了位置として算出される。
【００５３】
図６および図７を参照して、チャンクアライメントモジュール６１によって、ｉ番目のアラインドチャンクの開始位置と終了位置とが決定される場合の具体的な動作の例を説明する。
【００５４】
図６は、ｉ番目のアラインドチャンクの開始位置を決定するときに、ｉ番目の仮のチャンク５１１の開始位置５１１Ｓ（第１ファイル位置）を先頭とする、指定されたサイズの第１バイト列５１１Ａがファイル５からバッファに読み込まれる場合を示している。チャンク先頭レコード開始位置算出部６１２は、第１バイト列５１１Ａの先頭からレコード開始位置を探索する。
【００５５】
第１バイト列５１１Ａの先頭にあるレコード５２１（レコードｘ）は、その途中から第１バイト列５１１Ａに含まれている。したがって、このレコード５２１のレコード開始位置は第１バイト列５１１Ａに含まれていない。そのため、レコード５２１に後続するレコード５２２（レコード（ｘ＋１））のレコード開始位置が、ｉ番目のアラインドチャンク５５１の開始位置５５１Ｓとして算出される。つまり、第１バイト列５１１Ａを先頭から探索した場合に最初に見つかる完全なレコード５２２の開始位置が、ｉ番目のアラインドチャンク５５１の開始位置５５１Ｓとして算出される。
【００５６】
次いで、図７は、ｉ番目のアラインドチャンクの終了位置を決定するときに、（ｉ＋１）番目の仮のチャンク５１２の開始位置５１２Ｓを先頭とする、指定されたサイズの第２バイト列５１１Ｂがファイル５からバッファに読み込まれる場合を示している。チャンク最終レコード終了位置算出部６１３は、第２バイト列５１１Ｂの先頭からレコード開始位置を探索する。
【００５７】
第２バイト列５１１Ｂの先頭にあるレコード５２３（レコードｙ）は、その途中から第２バイト列５１１Ｂに含まれている。したがって、このレコード５２３のレコード開始位置は第２バイト列５１１Ｂに含まれていない。そのため、レコード５２３に後続するレコード５２４（レコード（ｙ＋１））のレコード開始位置が、（ｉ＋１）番目のアラインドチャンク５５２の開始位置５５２Ｓとして算出される。つまり、第２バイト列５１１Ｂを先頭から探索した場合に最初に見つかる完全なレコード５２４の開始位置が、（ｉ＋１）番目のアラインドチャンク５５２の開始位置５５２Ｓとして算出される。
【００５８】
そして、チャンク最終レコード終了位置算出部６１３は、（ｉ＋１）番目のアラインドチャンク５５２の開始位置５５２Ｓから１を引いた値を、ｉ番目のアラインドチャンク５５１の終了位置５５１Ｅとして算出する。
【００５９】
以上により、チャンクアライメントモジュール６１は、算出された開始位置５５１Ｓと終了位置５５１Ｅとで特定されるアラインドチャンクをファイル５から取得することができる。
【００６０】
また、図８は、ストレージシステム１によって実行される分割ファイル生成モジュール６２の機能構成を示す。分割ファイル生成モジュール６２は、例えば、プログラムモジュールであり、分割ファイルを生成するための命令群を含む。分割ファイル生成モジュール６２内の命令群は、例えば、ＣＵ２０のＣＰＵ２１によって実行される。
【００６１】
分割ファイル生成モジュール６２は、チャンクアライメントモジュール６１と、分割ファイル出力部６２１とを備える。チャンクアライメントモジュール６１は、上述した通り、ファイル５から一つのアラインドチャンクを取得する。分割ファイル出力部６２１は、取得されたアラインドチャンクを分割ファイルとして出力する。分割ファイル出力部６２１は、アラインドチャンクを含む分割ファイルをストレージ（例えば、いずれかのＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２）に格納してもよい。分割ファイル出力部６２１は、ファイル５内の、アラインドチャンクの開始位置から終了位置までのバイト列を含む分割ファイルをストレージに書き込む。
【００６２】
なお、本ストレージシステム１は、ファイル５から複数のアラインドチャンク（分割ファイル）を取得する処理を、アラインドチャンク毎に並列に行うことができる。
【００６３】
図９は、ストレージシステム１によって実行される並列分散処理プログラム６Ａの機能構成の例を示す。この並列分散処理プログラム６Ａは、ファイル５から複数のアラインドチャンク（分割ファイル）を並列に取得するための命令群を含む。並列分散処理プログラム６Ａ内の命令群は、例えば、複数のＣＵ２０に設けられる複数のＣＰＵ２１にそれぞれタスクを割り当てることによって並列に実行される。つまり、複数のＣＵ２０が、並列処理のための複数の実行ユニットとして用いられる。この場合、いずれかのＣＵ２０が、タスクの割り当てのためのスケジューラ機能を有していてもよい。また、各ＣＰＵ２１は、複数のプロセッサ・コアを備えるマルチコアＣＰＵであってもよい。マルチコアＣＰＵを備える一つのＣＵ２０は、複数のタスクが割り当てられても性能が劣化しない。そのため、１つのＣＰＵ２１に複数のタスクを割り当ててもよい。各実行ユニットは、割り当てられたタスク（命令群）を実行可能な処理装置であり、例えば、プロセッサやプロセッサ・コアのような各種の回路（処理回路）によって実現され得る。
【００６４】
並列分散処理プログラム６Ａは、複数の分割ファイル生成モジュール６２−１，６２−２，……，６２−Ｎと、複数のファイル処理モジュール６３−１，６３−２，……，６３−Ｎとを備える。各分割ファイル生成モジュール６２−１，６２−２，……，６２−Ｎは、図８を参照して上述した分割ファイル生成モジュール６２と同様に動作し、ファイル５から一つの分割ファイルを生成する。
【００６５】
各分割ファイル生成モジュール６２−１，６２−２，……，６２−Ｎ内のチャンクアライメントモジュール６１により算出されるアラインドチャンクの開始位置および終了位置は、複数のＣＵ２０を用いて並列に算出される。例えば、分割ファイル生成モジュール６２−１内のチャンクアライメントモジュール６１により算出されるアラインドチャンクの開始位置および終了位置と、別の分割ファイル生成モジュール６２−２内のチャンクアライメントモジュール６１により算出されるアラインドチャンクの開始位置および終了位置とは、複数のＣＵ２０を用いて並列に算出される。あるいは、分割ファイル生成モジュール６２−１内のチャンクアライメントモジュール６１により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置と、別の分割ファイル生成モジュール６２−２内のチャンクアライメントモジュール６１により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置とは、複数のＣＵ２０を用いて並列に算出されてもよい。
【００６６】
各ファイル処理モジュール６３−１，６３−２，……，６３−Ｎは、関連付けられたいずれかの分割ファイル生成モジュール６２−１，６２−２，……，６２−Ｎによって出力された分割ファイルを処理する。より詳しくは、ファイル処理モジュール６３−１は、分割ファイル生成モジュール６２−１によってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。ファイル処理モジュール６３−２は、分割ファイル生成モジュール６２−２によってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。また、ファイル処理モジュール６３−Ｎは、分割ファイル生成モジュール６２−Ｎによってストレージに格納された分割ファイルを読み出し、読み出された分割ファイルに任意の処理を施す。この任意の処理には、例えば、ゲノム解析、顧客情報や購入履歴情報のような種々の産業データ（ビッグデータ）の検索、保守、解析等が含まれる。
【００６７】
なお、互いに関連付けられた分割ファイル生成モジュール６２−１，６２−２，……，６２−Ｎとファイル処理モジュール６３−１，６３−２，……，６３−Ｎとが、異なるＣＵ２０を用いて実行されてもよい。例えば、分割ファイル生成モジュール６２−１（チャンクアライメントモジュール６１）によるアラインドチャンクの開始位置および終了位置の算出処理が、第１のＣＵ２０を用いて行われ、ファイル処理モジュール６３−１による分割ファイルの処理が、第２のＣＵ２０を用いて行われてもよい。この場合、第１のＣＵ２０は、分割ファイルのファイル名を第２のＣＵ２０に通知（送信）してもよい。
【００６８】
図１０のフローチャートを参照して、図９の機能構成を有するストレージシステム１によって実行されるファイル分割処理の手順を説明する。ストレージシステム１に設けられる複数のＣＵ２０は、一つのファイルが分割されたＮ個の分割ファイルをそれぞれ生成するためのＮ個の処理を並列に実行することができる。ここでは、一つ以上のＣＵ２０によって、Ｎ個の分割ファイルの内のｉ番目の分割ファイルが生成される場合を例示する。
【００６９】
まず、ＣＵ２０は、ファイル５内のｉ番目のチャンクの開始位置と終了位置とを算出する（ステップＳ１０１）。これら開始位置と終了位置とは、ファイル５のサイズと、ファイル５が分割される数Ｎとを用いて算出される。そして、ＣＵ２０は、ファイル５内の、ｉ番目のチャンクの開始位置を先頭とする最大レコードサイズの２倍のデータを読み込む（ステップＳ１０２）。ＣＵ２０は、読み込まれたデータを用いて、ｉ番目のアラインドチャンクのチャンク先頭レコード開始位置を算出する（ステップＳ１０３）。
【００７０】
また、ＣＵ２０は、ファイル５内の、算出された終了位置の一つ後の位置を先頭とする最大レコードサイズの２倍のデータを読み込む（ステップＳ１０４）。ＣＵ２０は、（ｉ＋１）番目のアラインドチャンクのチャンク先頭レコード開始位置を算出する（ステップＳ１０５）。そして、ＣＵ２０は、（ｉ＋１）番目のアラインドチャンクのチャンク先頭レコード開始位置に基づいて、ｉ番目のアラインドチャンクのチャンク最終レコード終了位置を算出する（ステップＳ１０６）。ｉ番目のアラインドチャンクのチャンク最終レコード終了位置は、例えば、（ｉ＋１）番目のアラインドチャンクのチャンク先頭レコード開始位置の一つ前の位置である。
【００７１】
なお、ステップＳ１０２からステップＳ１０３までの手順とステップＳ１０４からステップＳ１０６までの手順とは、並列に実行されてもよい。つまり、ｉ番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とは、複数のＣＵ２０（実行ユニット）を用いて並列に算出されてもよい。また、ステップＳ１０２からステップＳ１０３までの手順の後に、ステップＳ１０４からステップＳ１０６までの手順が実行されてもよいし、あるいはステップＳ１０４からステップＳ１０６までの手順の後にステップＳ１０２からステップＳ１０３までの手順が実行されてもよい。
【００７２】
ＣＵ２０は、算出されたｉ番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とに基づいて、ファイル５内のｉ番目のアラインドチャンクを特定し、ｉ番目のアラインドチャンクを含む分割ファイルをストレージに格納する（ステップＳ１０７）。ＣＵ２０は、例えば、いずれかのＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２に分割ファイルを書き込むためのコマンドを発行することにより、分割ファイルをデータ記憶領域４０に格納する。
【００７３】
次いで、ＣＵ２０は、ストレージに格納された分割ファイルを読み出す（ステップＳ１０８）。そして、ＣＵ２０は、読み出された分割ファイルを処理する（ステップＳ１０９）。ＣＵ２０は、この分割ファイルに任意の処理を施すことができる。
【００７４】
以上のファイル分割処理により、ＣＵ２０は、ファイル５内のｉ番目のアラインドチャンクを含む分割ファイルをストレージに格納し、当該分割ファイルに任意の処理を施すことができる。なお、Ｎ番目のアラインドチャンク（すなわち、ファイル５の最後のアラインドチャンク）を算出する場合には、ステップＳ１０４からステップＳ１０６までの手順が、ファイル５の最後の位置（ファイルサイズ−１）を、Ｎ番目のアラインドチャンクのチャンク最終レコード終了位置として算出する手順に置き換えられる。
【００７５】
また、複数のＣＵ２０は、上述したファイル分割処理を複数並列に実行することにより、１番目からＮ番目までの分割ファイルを並列に生成および処理することができる。
【００７６】
また、図１１は、ストレージシステム１によって実行される並列分散処理プログラム６Ｂの機能構成の別の例を示す。この並列分散処理プログラム６Ｂは、ファイル５から複数のアラインドチャンクを並列に取得し、処理するための命令群を含む。並列分散処理プログラム６Ｂ内の命令群は、例えば、複数のＣＵ２０に設けられる複数のＣＰＵ２１にそれぞれタスクを割り当てることによって並列に実行される。その場合、いずれかのＣＵ２０が、タスクの割り当てのためのスケジューラ機能を有していてもよい。また、各ＣＰＵ２１は、マルチコアＣＰＵであってもよい。マルチコアＣＰＵを備える一つのＣＵ２０は、複数のタスクが割り当てられても性能が劣化しない。そのため、１つのＣＰＵ２１に複数のタスクを割り当ててもよい。
【００７７】
並列分散処理プログラム６Ｂは、複数のチャンクアライメントモジュール６１−１，６１−２，……，６１−Ｎと、複数のファイル処理モジュール６４−１，６４−２，……，６４−Ｎとを備える。各チャンクアライメントモジュール６１−１，６１−２，……，６１−Ｎは、図５を参照して上述したチャンクアライメントモジュール６１と同様に動作し、ファイル５から一つのアラインドチャンクを生成する。
【００７８】
各チャンクアライメントモジュール６１−１，６１−２，……，６１−Ｎにより算出されるアラインドチャンクの開始位置および終了位置は、複数のＣＵ２０を用いて並列に算出される。例えば、チャンクアライメントモジュール６１−１により算出されるアラインドチャンクの開始位置および終了位置と、別のチャンクアライメントモジュール６１−２により算出されるアラインドチャンクの開始位置および終了位置とは、複数のＣＵ２０を用いて並列に算出される。あるいは、チャンクアライメントモジュール６１−１により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置と、別のチャンクアライメントモジュール６１−２により算出されるアラインドチャンクの開始位置と、当該アラインドチャンクの終了位置とは、複数のＣＵ２０を用いて並列に算出される。
【００７９】
各ファイル処理モジュール６４−１，６４−２，……，６４−Ｎは、関連付けられたいずれかのチャンクアライメントモジュール６１−１，６１−２，……，６１−Ｎによって出力されたアラインドチャンクを処理する。より詳しくは、ファイル処理モジュール６４−１は、チャンクアライメントモジュール６１−１によって出力された、ファイル５内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。ファイル処理モジュール６４−２は、チャンクアライメントモジュール６１−２によって出力された、ファイル５内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。また、ファイル処理モジュール６４−Ｎは、チャンクアライメントモジュール６１−Ｎによって出力された、ファイル５内のアラインドチャンクの開始位置から終了位置までのバイト列に任意の処理を施す。この任意の処理には、例えば、ゲノム解析、顧客情報や購入履歴情報のような種々の産業データの検索、保守、解析等が含まれる。
【００８０】
なお、互いに関連付けられたチャンクアライメントモジュール６１−１，６１−２，……，６１−Ｎとファイル処理モジュール６４−１，６４−２，……，６４−Ｎとが、異なるＣＵ２０を用いて実行されてもよい。例えば、チャンクアライメントモジュール６１−１によるアラインドチャンクの開始位置および終了位置の算出処理が、第１のＣＵ２０を用いて行われ、関連付けられたファイル処理モジュール６４−１によるアラインドチャンクの開始位置から終了位置までのバイト列の処理が、第２のＣＵ２０を用いて行われてもよい。この場合、第１のＣＵ２０はアラインドチャンクの開始位置から終了位置までのバイト列を第２のＣＵ２０に送信してもよいし、アラインドチャンクの開始位置と終了位置とを示す情報を第２のＣＵ２０に送信してもよい。
【００８１】
図１２のフローチャートを参照して、図１１の機能構成を有するストレージシステム１によって実行されるファイル分割処理の手順を説明する。ストレージシステム１に設けられる複数のＣＵ２０は、一つのファイルが分割されたＮ個のアラインドチャンクをそれぞれ生成するためのＮ個の処理を並列に実行することができる。ここでは、一つ以上のＣＵ２０によって、Ｎ個のアラインドチャンクの内のｉ番目のアラインドチャンクが生成される場合を例示する。
【００８２】
ステップＳ２０１からステップＳ２０６までの手順は、図１０を参照して上述したステップＳ１０１からステップＳ１０６までの手順と同様である。
【００８３】
ＣＵ２０は、算出されたｉ番目のアラインドチャンクのチャンク先頭レコード開始位置とチャンク最終レコード終了位置とに基づいて、ファイル５内のｉ番目のアラインドチャンクを特定し、ｉ番目のアラインドチャンクを処理する（ステップＳ２０７）。ＣＵ２０は、このアラインドチャンクに任意の処理を施すことができる。
【００８４】
以上のファイル分割処理により、ＣＵ２０は、ファイル５内のｉ番目のアラインドチャンクを特定し、このアラインドチャンクに任意の処理を施すことができる。このように、アラインドチャンクをストレージに格納することなく、そのまま処理することもできる。また、複数のＣＵ２０は、上述したファイル分割処理を複数並列に実行することにより、１番目からＮ番目までのアラインドチャンクを並列に生成および処理することができる。
【００８５】
次いで、ファイル５内のレコードがエンコードされるフォーマットがＦＡＳＴＱフォーマットである場合について具体的に例示する。
【００８６】
ＦＡＳＴＱフォーマットのレコード構造は以下のように定義される。  
@title and optional description  
sequence line(s)  
+optional repeat of title line  
quality line(s)
このように、ＦＡＳＴＱフォーマットの一つのレコードは、四つのタイプの行（ｌｉｎｅ）を含む。この行は、上述したフォーマットのレコード構造を規定するフィールドに相当する。各タイプの行は、以下の特徴を有する。
（１）@title and optional description：  ‘＠’から始まり、レコードの識別子となるタイトルを含み、任意の注釈やコメントを含み得る行である。長さが制限されていない自由なフォーマットのフィールドである。以下、タイトルラインとも称する。
（２）sequence line(s)：  一行以上のシーケンスラインに、ＤＮＡやＲＮＡの塩基配列を表す一つ以上の文字が含まれる。タブやスペースのような余白は許されない。
（３）+optional repeat of title line：  ‘＋’から始まり、シーケンスラインの終了とクオリティラインの開始とを表す。この行には、‘＋’だけが含まれていてもよいし、‘＋’の後に、（１）のタイトルラインにおける‘＠’より後の記述が含まれていてもよい。以下、プラスラインとも称する。
（４）quality line(s)：  一行以上のクオリティラインに、ＤＮＡやＲＮＡの塩基配列のクオリティスコアを表す一つ以上の文字が含まれる。この一つ以上の文字には、‘＠’も含まれ得る。
【００８７】
なお、シーケンスラインに含まれる文字列の長さ（文字数）と、クオリティラインに含まれる文字列の長さ（文字数）は同じである。つまり、シーケンスラインのバイト長とクオリティラインのバイト長は等しい。
【００８８】
一つのファイルには、一つ以上のレコードが含まれる。図１３は、ＦＡＳＴＱフォーマットのレコードを含むファイルの例を示す。ファイル７１は、ＦＡＳＴＱフォーマットに従ってそれぞれエンコードされた複数の可変長レコード７１１，７１２，７１３で構成されている。
【００８９】
先頭のレコード７１１において、一番目の行は、‘＠’から始まり、タイトル（識別子）である“ＳＥＱ＿ＩＤ１”が続くタイトルラインである。二番目の行は、塩基配列を表す文字列を含むシーケンスラインである。三番目の行は‘＋’から始まるプラスラインである。四番目の行は、クオリティスコアを表す文字列を含むクオリティラインである。
【００９０】
シーケンスラインの塩基配列を表す文字列と、クオリティラインのクオリティスコアを表す文字列とは、先頭から順にそれぞれ対応している。レコード７１１では、例えば、シーケンスラインの先頭の文字‘Ｇ’と、クオリティラインの先頭の文字‘！’とが対応している。すなわち、塩基配列‘Ｇ’のクオリティスコアが‘！’であることが示されている。このような関係を有しているため、シーケンスラインに含まれる文字列の長さ（バイト長）と、クオリティラインに含まれる文字列の長さ（バイト長）とは同一になる。
【００９１】
後続する他のレコード７１２，７１３も同様に、ＦＡＳＴＱフォーマットに従った構造を有している。
【００９２】
図１４および図１５を参照して、ＦＡＳＴＱフォーマットのファイルからアラインドチャンクが算出される処理について説明する。
【００９３】
図１４のフローチャートは、ＣＵ２０によって実行される、アラインドチャンクの開始位置を算出するための処理の手順を示す。ＣＵ２０は、例えば、チャンク先頭レコード開始位置算出部６１２に含まれる命令群を実行することにより、アラインドチャンクの開始位置を算出する。
【００９４】
ここでは、この命令群が、アラインドチャンクの開始位置を探索するための関数ＳｅａｒｃｈＦｉｒｓｔＲｅｃｏｒｄＯｆＣｈｕｎｋとして実現される場合を例示する。ＣＵ２０は、この関数を実行する（呼び出す）ことにより、ファイル内の、アラインドチャンクの開始位置を取得することができる。この関数の引数は、入力ファイル（ｉｎＦｉｌｅ）と、チャンク開始位置（ｓｔａｒｔＣｈｕｎｋ）と、最大レコードサイズ（ｍａｘＲｅｃｏｒｄＳｉｚｅ）である。入力ファイルは、分割対象のファイルである。チャンク開始位置は、入力ファイルが、分割される総数Ｎに基づいて均等に分割される場合の仮のチャンクの開始位置である。最大レコードサイズは、ファイルに含まれるレコードの最大のサイズであり、例えば、バイト単位で指定される。
【００９５】
なお、この処理では、以下のように規定される関数が用いられる。  
（１）Ｒｅａｄ（ｆ，ｓ，ｍ）：  ファイルｆの先頭ｓバイト目から最大ｍバイトをバッファに読み込み、バッファを返す。データが読み込めない場合、ＮＵＬＬを返す。  
（２）ＳｅａｒｃｈＣａｎｄｉｄａｔｅＨｅａｄｅｒ（ｂｕｆ，ｐ）：  バッファｂｕｆの先頭からｐバイト目以降で、最初に見つかった文字‘＠’で始まる行の行頭位置を返す。文字‘＠’で始まる行が見つからなければＮＵＬＬを返す。  
（３）ＮｅｘｔＬｉｎｅ（ｂｕｆ，ｐ）：  バッファｂｕｆの先頭ｐバイト目以降で最初に見つかった改行文字のバイト位置＋１を返す。改行文字が見つからなければＮＵＬＬを返す。  
（４）ＳｅａｒｃｈＣａｎｄｉｄａｔｅＤｅｌｉｍｉｔｅｒ（ｂｕｆ，ｐ，ｔ）：  バッファｂｕｆの先頭からｐバイト目以降で、最初に見つかった文字‘＋’で始まる行の行頭の、バッファｂｕｆの先頭からのバイト位置をｘとする。文字‘＋’で始まる行が見つかり、且つバッファｂｕｆの先頭（ｘ＋１）バイト目が改行文字、またはバッファｂｕｆの先頭（ｘ＋１）バイト目から最初の改行までの文字列とバッファｂｕｆの先頭からｔバイト目から最初の改行までの文字列とが一致する場合は、ｘを返す。それ以外の場合はＮＵＬＬを返す。
【００９６】
上記の関数を用いる、アラインドチャンクの開始位置を算出するための処理の手順を説明する。
【００９７】
まず、ＣＵ２０は、Ｒｅａｄ関数を用いて、アラインドチャンクの開始位置を検出するために必要なデータ（バイト列）をファイルからバッファｂｕｆに読み込み、バッファｂｕｆの先頭文字の位置（アドレス）を変数ｐに設定し、バッファｂｕｆの最終文字の位置（アドレス）を変数ｅに設定する（ステップＳ３０１）。Ｒｅａｄ関数には、引数として、入力ファイル（ｉｎＦｉｌｅ）と、チャンク開始位置（ｓｔａｒｔＣｈｕｎｋ）と、最大レコードサイズの２倍の値（２＊ｍａｘＲｅｃｏｒｄＳｉｚｅ）とが指定されている。バッファｂｕｆに最大レコードサイズの２倍のバイト列が読み込まれることにより、そのバイト列に少なくとも一つのレコードの先頭位置が含まれるので、アラインドチャンクの開始位置となるレコードの先頭位置を確実に検出することができる。
【００９８】
ＣＵ２０は、バッファｂｕｆがＮＵＬＬであるか否かを判定する（ステップＳ３０２）。バッファｂｕｆがＮＵＬＬである場合（ステップＳ３０２のＹＥＳ）、ステップＳ３１１に進み、エラーを示す値（ここでは、−１）を返す。これは、ファイルから、規定されたフォーマットの構造を有するレコードを検出できなかったことを意味する。
【００９９】
バッファｂｕｆがＮＵＬＬでない場合（ステップＳ３０２のＮＯ）、ＣＵ２０は、ＳｅａｒｃｈＣａｎｄｉｄａｔｅＨｅａｄｅｒ関数を用いて、バッファｂｕｆに含まれるバイト列から、レコードの先頭の行の行頭位置の候補を変数ｐ１に代入する（ステップＳ３０３）。ＳｅａｒｃｈＣａｎｄｉｄａｔｅＨｅａｄｅｒ関数には、引数として、バッファｂｕｆと、バッファの先頭文字のアドレスｐとが指定されている。バッファｂｕｆの先頭からｐバイト目以降に文字‘＠’で始まる行が存在する場合、変数ｐ１には、先頭からｐバイト目以降で、文字‘＠’で始まる最も前方の行の行頭位置が設定される。つまり、変数ｐ１には、タイトルラインの行頭位置の候補が設定される。一方、バッファｂｕｆの先頭からｐバイト目以降に文字‘＠’で始まる行が存在しない場合、変数ｐ１にはＮＵＬＬが設定される。
【０１００】
ＣＵ２０は、変数ｐ１がＮＵＬＬであるか否かを判定する（ステップＳ３０４）。変数ｐ１がＮＵＬＬである場合（ステップＳ３０４のＹＥＳ）、ステップＳ３１１に進み、−１を返す。
【０１０１】
変数ｐ１がＮＵＬＬでない場合（ステップＳ３０４のＮＯ）、ＣＵ２０は、ＮｅｘｔＬｉｎｅ関数を用いて、変数ｐ１の位置から始まる行の次の行の行頭位置を変数ｐ２に設定する（ステップＳ３０５）。ＮｅｘｔＬｉｎｅ関数には、バッファｂｕｆと、‘＠’で始まる行の行頭位置が設定された変数ｐ１とが指定されている。バッファｂｕｆの先頭からｐ１バイト目以降に改行文字が存在する場合、変数ｐ２には、ｐ１バイト目以降で、最も前方の改行文字に１を加えた値が設定される。つまり、変数ｐ２には、シーケンスラインの行頭位置の候補が設定される。一方、バッファｂｕｆの先頭からｐ１バイト目以降に改行文字が存在しない場合、変数ｐ２にはＮＵＬＬが設定される。
【０１０２】
ＣＵ２０は、変数ｐ２がＮＵＬＬであるか否かを判定する（ステップＳ３０６）。変数ｐ２がＮＵＬＬである場合（ステップＳ３０６のＹＥＳ）、ステップＳ３１１に進み、−１を返す。
【０１０３】
変数ｐ２がＮＵＬＬでない場合（ステップＳ３０６のＮＯ）、ＣＵ２０は、ＳｅａｒｃｈＣａｎｄｉｄａｔｅＤｅｌｉｍｉｔｅｒ関数を用いて、変数ｐ２の位置以降で、文字‘＋’で始まる行の行頭位置を変数ｐ３に設定する（ステップＳ３０７）。なお、文字‘＋’で始まる行の行頭位置の次の文字が改行文字である場合、あるいは、文字‘＋’で始まる行の行頭位置の次の文字から最初の改行文字までの文字列と、バッファｂｕｆの先頭からｔバイト目から最初の改行までの文字列とが一致する場合に、文字‘＋’で始まる行の行頭位置が変数ｐ３に設定される。つまり、変数ｐ３には、プラスラインの行頭位置の候補が設定される。これ以外の場合は、変数ｐ３にはＮＵＬＬが設定される。
【０１０４】
ＣＵ２０は、変数ｐ３がＮＵＬＬであるか否かを判定する（ステップＳ３０８）。変数ｐ３がＮＵＬＬである場合（ステップＳ３０８のＹＥＳ）、ステップＳ３１１に進み、−１を返す。
【０１０５】
変数ｐ３がＮＵＬＬでない場合（ステップＳ３０８のＮＯ）、ＣＵ２０は、ＮｅｘｔＬｉｎｅ関数を用いて、変数ｐ３の位置から始まる行の次の行の行頭位置を変数ｐ４に設定し、変数ｐ３と変数ｐ２との差を変数Ｌに設定する（ステップＳ３０９）。ＮｅｘｔＬｉｎｅ関数には、バッファｂｕｆと、‘＋’で始まる行の行頭位置が設定された変数ｐ３とが指定されている。バッファｂｕｆの先頭からｐ３バイト目以降に改行文字が存在する場合、変数ｐ４には、ｐ３バイト目以降で、最も前方の改行文字に１を加えた値が設定される。つまり、変数ｐ４には、クオリティラインの先頭位置の候補が設定される。一方、バッファｂｕｆの先頭からｐ３バイト目以降に改行文字が存在しない場合、変数ｐ４にはＮＵＬＬが設定される。また、変数Ｌには、プラスラインの先頭位置の候補から、シーケンスラインの先頭位置の候補を引いた差、すなわち、シーケンスラインに含まれる文字列の長さ（バイト長）が設定される。
【０１０６】
次いで、ＣＵ２０は、変数ｐ４に変数Ｌを加えた値が変数ｅ以上であるか否かを判定する（ステップＳ３１０）。つまり、ＣＵ２０は、クオリティラインの先頭位置ｐ４に、シーケンスラインに含まれる文字列の長さＬを加えた値が、バッファｂｕｆの最終文字のアドレスｅ以上であるか否かを判定する。変数ｐ４に変数Ｌを加えた値が変数ｅ以上である場合（ステップＳ３１０のＹＥＳ）、バッファｂｕｆ内に、シーケンスラインと同一の長さを有する適切なクオリティラインが含まれていないので、ステップＳ３１１に進み、−１を返す。
【０１０７】
変数ｐ４に変数Ｌを加えた値が変数ｅ未満である場合（ステップＳ３１０のＮＯ）、ＣＵ２０は、変数ｐ４に変数Ｌを加えた値から１を引いた値が変数ｅと等しいか、あるいはバッファｂｕｆ内の（ｐ４＋Ｌ）バイト目の文字が‘＠’であるかを判定する（ステップＳ３１２）。変数ｐ４に変数Ｌを加えた値から１を引いた値が変数ｅと等しいことは、クオリティラインの最終位置が、バッファｂｕｆの最終文字のアドレスと一致していることを示す。また、バッファｂｕｆ内の（ｐ４＋Ｌ）バイト目の文字が‘＠’であることは、クオリティラインの最終位置の次の位置に、次のレコードのタイトルラインの先頭と推定される文字‘＠’が存在することを示す。したがって、変数ｐ４に変数Ｌを加えた値から１を引いた値が変数ｅと等しいか、バッファｂｕｆ内の（ｐ４＋Ｌ）バイト目の文字が‘＠’であるかの少なくともいずれかである場合には、バッファｂｕｆ内のｐ１バイト目から（ｐ４＋Ｌ−１）バイト目までのバイト列が一つのレコードに対応すると云える。
【０１０８】
変数ｐ４に変数Ｌを加えた値から１を引いた値が変数ｅと等しいか、バッファｂｕｆ内の（ｐ４＋Ｌ）バイト目の文字が‘＠’であるかの少なくともいずれかである場合（ステップＳ３１２のＹＥＳ）、ＣＵ２０は、タイトルラインの先頭位置を示す変数ｐ１からバッファｂｕｆの先頭文字の位置を引いた値を、引数ｓｔａｒｔＣｈｕｎｋに加えた値を返す（ステップＳ３１３）。
【０１０９】
変数ｐ４に変数Ｌを加えた値から１を引いた値が変数ｅとは異なり、且つバッファｂｕｆ内の（ｐ４＋Ｌ）バイト目の文字が‘＠’ではない場合（ステップＳ３１２のＮＯ）、ＣＵ２０は、変数ｐに、変数ｐ２の値を設定し（ステップＳ３１４）、ステップＳ３０２に戻る。これにより、バッファｂｕｆ内の変数ｐ２で示される位置から、再度、アラインドチャンクの先頭位置を探索するための処理が行われる。
【０１１０】
以上により、指定された入力ファイル（ｉｎＦｉｌｅ）内の、指定された位置（ｓｔａｒｔＣｈｕｎｋ）か、それより後にある最初のレコード開始位置を、アラインドチャンクの開始位置として算出することができる。また、アラインドチャンクの開始位置が算出できない場合には、エラーを示す値（例えば、−１）を出力することもできるので、例えば、ＦＡＳＴＱフォーマットに従っていない入力ファイルが誤って指定されたこと等を検出することができる。
【０１１１】
また、図１５のフローチャートは、アラインドチャンクの終了位置を算出するための処理の手順を示す。ＣＵ２０は、例えば、チャンク最終レコード終了位置算出部６１３に含まれる命令群を実行することにより、アラインドチャンクの終了位置を算出する。
【０１１２】
ここでは、この命令群が、アラインドチャンクの終了位置を探索するための関数ＳｅａｒｃｈＬａｓｔＲｅｃｏｒｄＯｆＣｈｕｎｋとして実現される場合を例示する。ＣＵ２０は、この関数を実行する（呼び出す）ことにより、ファイル内の、アラインドチャンクの終了位置を取得することができる。この関数の引数は、入力ファイル（ｉｎＦｉｌｅ）と、チャンク終了位置（ｅｎｄＣｈｕｎｋ）と、最大レコードサイズ（ｍａｘＲｅｃｏｒｄＳｉｚｅ）である。入力ファイルは、分割対象のファイルである。チャンク終了位置は、入力ファイルが、分割される総数Ｎに基づいて均等に分割される場合のチャンクの終了位置である。最大レコードサイズは、ファイルに含まれるレコードの最大のサイズであり、例えば、バイト単位で指定される。なお、この処理では、図１４を参照して上述したＳｅａｒｃｈＦｉｒｓｔＲｅｃｏｒｄＯｆＣｈｕｎｋ関数が用いられる。
【０１１３】
ＣＵ２０は、ＳｅａｒｃｈＦｉｒｓｔＲｅｃｏｒｄＯｆＣｈｕｎｋ関数を用いて、入力ファイルｉｎＦｉｌｅ内の、チャンク終了位置ｅｎｄＣｈｕｎｋより後に存在するアラインドチャンクのチャンク開始位置を算出し、算出されたチャンク開始位置を変数ｐに設定する（ステップＳ４０１）。このチャンク開始位置は、チャンク終了位置を算出しようとしているアラインドチャンクに後続するアラインドチャンクの開始位置である。ＳｅａｒｃｈＦｉｒｓｔＲｅｃｏｒｄＯｆＣｈｕｎｋ関数は、この後続するアラインドチャンクの開始位置が算出された場合には、その開始位置を返し、算出されなかった場合には、エラーを示す値（ここでは、−１）を返す。
【０１１４】
ＣＵ２０は、変数ｐが−１と等しいか否かを判定する（ステップＳ４０２）。つまり、ＣＵ２０は、変数ｐに基づいて、後続するアラインドチャンクの開始位置が算出できたか否かを判定する。変数ｐが−１と等しい場合（ステップＳ４０２のＹＥＳ）、すなわち、後続するアラインドチャンクの開始位置が算出できなかった場合、ＣＵ２０は、チャンク終了位置ｅｎｄＣｈｕｎｋを、アラインドチャンクのチャンク終了位置として返す（ステップＳ４０３）。
【０１１５】
一方、変数ｐが−１でない場合（ステップＳ４０２のＮＯ）、すなわち、後続するアラインドチャンクの開始位置が算出できた場合、ＣＵ２０は、変数ｐから１を引いた値を返す（ステップＳ４０４）。つまり、後続するアラインドチャンクの開始位置の一つ前の位置が、アラインドチャンクのチャンク終了位置として返される。
【０１１６】
以上により、指定された入力ファイル（ｉｎＦｉｌｅ）内の、指定された位置（ｅｎｄＣｈｕｎｋ）か、それより後にある最初のレコード終了位置を、アラインドチャンクの終了位置として算出することができる。
（第２実施形態）
第１実施形態では、ストレージシステム１に設けられる複数のＣＵ２０を用いて、一つのファイルを分割した複数の分割ファイル（アラインドチャンク）が並列に生成される。これに対して、第２実施形態では、複数の実行ユニット（例えば、複数のプロセッサ・コア）を用いて、一つのファイルを分割した複数の分割ファイル（アラインドチャンク）が並列に生成される。
【０１１７】
第２実施形態に係る電子機器によって実行されるプログラム（プログラムモジュール）の機能構成は、第１実施形態のストレージシステム１によって実行されるプログラムモジュールの機能構成と同様であり、第２実施形態と第１実施形態とでは、プログラムモジュールを実行するシステム構成のみが異なる。以下、第１実施形態と異なる点のみを説明する。
【０１１８】
第２実施形態の電子機器は、パーソナルコンピュータ、サーバコンピュータ、または各種電子機器に内蔵される組み込みシステムとして実現され得る。以下では、この電子機器が、サーバコンピュータ８として実現される場合を例示する。
【０１１９】
図１６に示すように、サーバコンピュータ８は、ＣＰＵ８１、システムコントローラ８２、主メモリ８３、グラフィクスプロセッシングユニット（ＧＰＵ）８４、ビデオメモリ（ＶＲＡＭ）８４Ａ、ＢＩＯＳ−ＲＯＭ８５、不揮発性メモリ８６、ネットワークコントローラ８７、エンベデッドコントローラ（ＥＣ）８８等を備える。
【０１２０】
ＣＰＵ８１は、サーバコンピュータ８内の様々なコンポーネントの動作を制御するプロセッサである。ＣＰＵ８１は、ストレージデバイスである不揮発性メモリ８６から主メモリ８３にロードされる様々なプログラムを実行する。これらプログラムには、オペレーティングシステム（ＯＳ）８３Ａ、及び様々なアプリケーションプログラムが含まれている。アプリケーションプログラムには、並列分散処理プログラム８３Ｂが含まれている。この並列分散処理プログラム８３Ｂは、一つのファイルから複数の分割ファイル（または複数のアラインドチャンク）を並列に生成するための命令群、複数の分割ファイル（または複数のアラインドチャンク）を並列に処理するための命令群、等を含む。並列分散処理プログラム８３Ｂは、図９を参照して上述した並列分散処理プログラム６Ａの機能構成を有していてもよいし、図１１を参照して上述した並列分散処理プログラム６Ｂの機能構成を有していてもよい。
【０１２１】
また、ＣＰＵ８１は、ＢＩＯＳ−ＲＯＭ８５に格納された基本入出力システム（ＢＩＯＳ）も実行する。ＢＩＯＳは、ハードウェア制御のためのプログラムである。
【０１２２】
システムコントローラ８２は、ＣＰＵ１０１のローカルバスと各種コンポーネントとの間を接続するデバイスである。システムコントローラ８２には、主メモリ８３をアクセス制御するメモリコントローラも内蔵されている。また、システムコントローラ８２は、ＰＣＩ  ＥＸＰＲＥＳＳ規格のシリアルバスなどを介してグラフィクスプロセッシングユニット（ＧＰＵ）８４との通信を実行する機能も有している。
【０１２３】
ＧＰＵ８４は、サーバコンピュータ８に接続されるディスプレイを制御する表示コントローラである。このＧＰＵ８４によって生成される表示信号はディスプレイに送られる。
【０１２４】
また、ＧＰＵ８４は、表示信号の生成のようなグラフィックス処理以外の汎用的な演算も行うことができる。ＧＰＵ８４は、例えば、複数のプロセッサ・コア９２−１，９２−２，９２−Ｎを備える。ＧＰＵ８４によってマルチスレッド化されたプログラムが実行される場合、スケジューラ９１は、そのプログラムに対応する処理が分割された複数のスレッドを複数のプロセッサ・コア９２−１，９２−２，９２−Ｎに割り当てる。このスレッドは、複数のプロセッサ・コア９２−１，９２−２，９２−Ｎのそれぞれに割り当てられる処理単位である。各プロセッサ・コア９２−１，９２−２，９２−Ｎは、割り当てられたスレッドを処理する実行ユニットである。複数のプロセッサ・コア９２−１，９２−２，９２−Ｎを備えるＧＰＵ８４では、割り当てられた複数のスレッドを並列に動作させることができる。並列分散処理プログラム８３Ｂは、ＧＰＵ８４によって、ファイル分割のための処理が分割された複数のスレッドが並列に動作するマルチスレッド処理として実行され得る。
【０１２５】
ネットワークコントローラ８７は、有線または無線通信を実行するように構成されたデバイスである。ネットワークコントローラ８７は、信号を送信する送信部と、信号を受信する受信部とを含む。このネットワークコントローラ８７を介して、分割対象のファイルを受信してもよいし、一つのファイルを分割して得られた分割ファイルやアラインドチャンクを、別の電子機器に送信してもよい。
【０１２６】
ＥＣ８８は、電力管理のためのエンベデッドコントローラを含むワンチップマイクロコンピュータである。ＥＣ８８は、ユーザによるパワーボタンの操作に応じて本サーバコンピュータ８を電源オン又は電源オフする機能を有している。
【０１２７】
このようなサーバコンピュータ８の構成でも、第１実施形態と同様に、複数のプロセッサ・コア９２−１，９２−２，９２−Ｎを用いて、ファイル５から複数のアラインドチャンク（または分割ファイル）を並列に取得および処理することができる。
【０１２８】
以上説明したように、第１および第２実施形態によれば、ファイルを効率的に分割することができる。ファイル入力部６１１は、第１フォーマットに従ってそれぞれエンコードされた複数の可変長レコードで構成されるファイル５から、当該ファイル５に含まれるバイト列の少なくとも一部を読み出す。チャンク先頭レコード開始位置算出部６１２は、第１フォーマットに基づいて、ファイル５内の第１ファイル位置以降にある最初のレコード先頭バイトの位置である第１チャンク開始位置を算出する。チャンク最終レコード終了位置算出部６１３は、第１フォーマットに基づいて、ファイル５内の、第１ファイル位置よりも後の第２ファイル位置以降にある最初のレコード終了バイトの位置である第１チャンク終了位置を算出する。
【０１２９】
これにより、算出された第１チャンク開始位置と第１チャンク終了位置とを用いて、ファイル５から、レコード境界でアライメントされたアラインドチャンクを取得することができる。ファイル５内のあるアラインドチャンクを取得するために、第１チャンク開始位置と第１チャンク終了位置とを算出する処理は、ファイル５内のその他のアラインドチャンクを取得するために、それらアラインドチャンクの各々の開始位置と終了位置とを算出する処理の過程や結果に依存しない。したがって、ファイル５に含まれる複数のアラインドチャンクは、それぞれ並列に決定することができ、ファイルを効率的に分割することができる。ファイル分割の並列分散処理が可能であることによって、ファイル５が分割される総数Ｎが増加するほど、ファイル５から分割ファイル群を生成するために要する時間を短くすることができる。
【０１３０】
また、第１および第２実施形態に記載された様々な機能の各々は、回路（処理回路）によって実現されてもよい。処理回路の例には、中央処理装置（ＣＰＵ）のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム（命令群）を実行することによって、記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。これら実施形態に記載されたＣＰＵ以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
【０１３１】
また、第１および第２実施形態の各種処理はコンピュータプログラムによって実現することができるので、このコンピュータプログラムを格納したコンピュータ読み取り可能な記憶媒体を通じてこのコンピュータプログラムをコンピュータにインストールして実行するだけで、これら実施形態と同様の効果を容易に実現することができる。
【０１３２】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１３３】
１…ストレージシステム、２…クライアント装置、１０…ネットワークスイッチ、２０…コネクションユニット（ＣＵ）、２１…ＣＰＵ、２２…ＲＡＭ、２３…ノードモジュールインタフェース（ＮＭ  Ｉ／Ｆ）、３０…ノードモジュール（ＮＭ）、３１…ノードコントローラ（ＮＣ）、３２…ＮＡＮＤ型フラッシュメモリ、４０…データ記憶領域、５…ファイル、５１１…仮のチャンク、５５１…アラインドチャンク、６１…チャンクアライメントモジュール、６１１…ファイル入力部、６１２…チャンク先頭レコード開始位置算出部、６１３…チャンク最終レコード終了位置算出部、６２…分割ファイル生成モジュール、６２１…分割ファイル出力部、６Ａ，６Ｂ…並列分散処理プログラム。
【図１】
2019101450.tif 000003
【図２】
2019101450.tif 000004
【図３】
2019101450.tif 000005
【図４】
2019101450.tif 000006
【図５】
2019101450.tif 000007
【図６】
2019101450.tif 000008
【図７】
2019101450.tif 000009
【図８】
2019101450.tif 000010
【図９】
2019101450.tif 000011
【図１０】
2019101450.tif 000012
【図１１】
2019101450.tif 000013
【図１２】
2019101450.tif 000014
【図１３】
2019101450.tif 000015
【図１４】
2019101450.tif 000016
【図１５】
2019101450.tif 000017
【図１６】
2019101450.tif 000018