データを分割する処理をコンピュータに実行させるプログラムであって、前記コンピュータに、前記データを所定の読取単位毎に順次読み取る読取ステップ、前記読取ステップで読み取ったデータが、データを分割する条件に該当するか否かを判定してそのデータ位置を取得する判定ステップ、前記データが前記条件に該当する位置で前記データを分割する分割ステップ、を実行させ、前記判定ステップでは、前記コンピュータに、前記読取ステップで読み取ったデータが、データを分割する条件である第1分割条件に該当するか否かを判定する第1判定ステップ、前記読取ステップで読み取ったデータが前記第1分割条件に該当しない場合は、前記読取ステップで読み取ったデータが、データを分割する条件である第2分割条件に該当するか否かをさらに判定する第2判定ステップ、を実行させ、前記第2判定ステップは、前記データの終端により近い位置を前記判定ステップの結果として優先的に用いるように構成されていることを特徴とするデータ分割プログラム。前記分割ステップで分割した後のデータの上限サイズをあらかじめ規定するステップを前記コンピュータに実行させ、前記読取ステップでは、前記コンピュータに、前記データを先頭から終端に向かって順次読み取らせ、前記データ分割ステップでは、前記コンピュータに、前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しなかった場合は、前記上限サイズで前記分割ステップを実行させることを特徴とする請求項1記載のデータ分割プログラム。前記分割ステップで分割した後のデータの下限サイズをあらかじめ規定するステップを前記コンピュータに実行させ、前記読取ステップでは、前記コンピュータに、前記データを終端から先頭に向かって順次読み取らせ、前記データ分割ステップでは、前記コンピュータに、前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しなかった場合は、前記下限サイズで前記分割ステップを実行させることを特徴とする請求項1記載のデータ分割プログラム。前記判定ステップでは、前記コンピュータに、前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しない場合は、前記読取ステップで読み取ったデータが、データを分割する条件である第3分割条件に該当するか否かをさらに判定する第3判定ステップを実行させ、前記分割ステップでは、前記コンピュータに、前記第1分割条件、前記第2分割条件、または前記第3分割条件のいずれかに該当した位置で前記データを分割させ、前記第3判定ステップは、前記データの終端により近い位置を前記判定ステップの結果として優先的に用いるように構成されていることを特徴とする請求項1から3のいずれか1項記載のデータ分割プログラム。前記分割ステップで分割したデータをそのデータのハッシュ値と対応付けて記憶装置に格納する格納ステップを前記コンピュータに実行させることを特徴とする請求項1から4のいずれか1項記載のデータ分割プログラム。前記格納ステップでは、前記コンピュータに、前記分割ステップで分割した前記データを固有に識別する番号を前記ハッシュ値と対応付けて前記記憶装置に格納させることを特徴とする請求項5記載のデータ分割プログラム。前記データが圧縮済みまたは暗号化されているか否かを判断するステップ、前記データが圧縮済みまたは暗号化されている場合は、前記読取ステップ、前記判定ステップ、前記分割ステップ、および前記格納ステップを省略し、前記データをそのハッシュ値と対応付けて記憶装置に格納する処理のみを実行するステップ、を前記コンピュータに実行させることを特徴とする請求項5または6記載のデータ分割プログラム。前記格納ステップでは、前記コンピュータに、前記データまたは前記分割ステップで分割した前記データを圧縮して記憶装置に格納させることを特徴とする請求項5から7のいずれか1項記載のデータ分割プログラム。データを分割する装置であって、前記データを所定の読取単位毎に順次読み取る読取部と、前記読取部が読み取ったデータが、データを分割する条件に該当するか否かを判定する分割条件判定部と、前記データが前記条件に該当する位置で前記データを分割する分割部と、を備え、前記分割条件判定部は、前記読取部が読み取ったデータが、データを分割する条件である第1分割条件に該当するか否かを判定し、前記読取部が読み取ったデータが前記第1分割条件に該当しない場合は、前記読取部が読み取ったデータが、データを分割する条件である第2分割条件に該当するか否かをさらに判定し、前記分割条件判定部は、前記データが第2分割条件に該当するか否かを判定する際に、前記データの終端により近い位置を優先的に用いることを特徴とするデータ分割装置。重複排除処理の効果を高めるためには、データをブロックに分割する際のブロックサイズをできる限り小さくしたほうがよいと考えられる。サイズが小さいブロックほど、他のブロックと一致する確率が高まるからである。一方で、データを圧縮する際には、圧縮前のデータサイズが大きいほど、圧縮効率がよいとされる。したがって、上述したバックアップの例のように、データをブロック毎に圧縮して保存する場合には、各ブロックサイズができる限り大きいほうがよいということになる。このことは、重複排除の効率を高めるために必要となる上記要件と相反している。重複排除とデータ圧縮は、ともに余分なデータを除去する目的があるので、総合的にデータサイズを小さくすることができる手法を優先すべきであると考えられる。特に上述したバックアップの例のように、重複排除とデータ圧縮を双方とも実施する場合には、上記のような相反する要求のバランスをとりつつ、総合的な効果としてデータサイズを小さくすることが肝要である。また、大容量のデータをバックアップする際には、バックアップ処理の効率も考慮する必要がある。分割ブロックのサイズを小さくすると、重複排除処理の効果は高まる反面、ブロックをバックアップメディアに格納する書込処理の回数が増えるため、結果としてバックアップ処理の時間が増大してしまう。以上のような理由から、データ重複排除とデータ圧縮のバランスをとることのできるデータ分割手法が望まれる。この点、上記特許文献1~4および非特許文献1では、重複排除処理のみに着目しており、したがって分割ブロックサイズを大きくするという観点は記載されていない。以下、個別に説明する。非特許文献1では、あるブロックと重複するブロックを高速に探す方法を記載しているが、その前提として、重複するブロックが多くなるようにデータを分割することについては、明確には開示していない。特許文献1では、分割条件を複数設け、第1分割条件に該当する分割候補が見つけられなければ、予備的な第2分割条件に該当する位置でデータを分割している。しかし、第1分割条件および第2分割条件ともに、分割ブロックのサイズが大きくなるように明示的に構成されているわけではない。したがって、原則として重複排除処理の効率が高くなるように分割位置を定めるように動作すると思われる。特許文献2~3でも、特許文献1と同様に分割ブロックのサイズが大きくなるとは限らない。また、複数の分割位置候補を比較するため、処理負荷が高く、処理効率が求められる用途には向かないと考えられる。特許文献4では、バイト列が書込済であるか否かを確認するために記憶装置から書込済データを読み取る必要があるので、記憶装置にアクセスする時間が長くなり、処理効率が高くないと考えられる。本発明は、上記のような課題を解決するためになされたものであり、データ重複排除を実施しつつ、データ圧縮効率を高めることのできるデータ分割手法を提供することを目的とする。本発明に係るデータ分割プログラムは、データを分割する位置を判定する際に、データの終端により近い位置を優先して保存しておき、その位置でデータを分割する。本発明に係るデータ分割プログラムでは、データ重複排除を実施するためのデータ分割を実施する過程で、データの終端により近い位置が優先的に用いられるので、データ圧縮の効果を高める方向に処理を振り向けつつ、データ重複排除を実施することができる。これにより、データ重複排除とデータ圧縮のバランスをとり、データサイズを小さくする効果を総合的に最適化することができる。また、これにより、バックアップ処理の時間を総合的に短縮することができる。<実施の形態1>図1は、本発明の実施形態1に係るデータ分割装置100の機能ブロック図である。データ分割装置100は、データを分割する処理を実施する装置であり、データ読取部110、分割条件判定部120、データ分割部130、データ格納部140を備える。データ読取部110は、ファイルサーバ200などのデータソースから、分割対象となるデータを読み取る。分割条件判定部120は、データ読取部110が読み取ったデータを順次取得し、データを分割する条件に該当するか否かを判定する。データ分割部130は、分割条件判定部120が判定した条件に該当する位置で、データをブロックに分割する。データ格納部140は、データ分割部130がデータ分割によって生成したデータブロックのハッシュ値を計算し、バックアップ装置400に格納する。また、データブロックとハッシュ値を対応付けてブロックDB300に格納する。ブロックDB300は、データ分割部130が元のデータを分割して生成したデータブロックを記憶するデータベースである。ブロックDB300は、ハードディスクなどの記憶装置を用いて構成することができる。バックアップ装置400は、データ格納部140が生成したハッシュ値を記憶する記憶装置である。データ読取部110、分割条件判定部120、データ分割部130、データ格納部140は、個別の機能部として構成することもできるし、一体的に構成することもできる。データ読取部110、分割条件判定部120、データ分割部130、データ格納部140は、これらの機能を実現する回路デバイスなどのハードウェアとして構成することもできるし、CPUCentralProcessingUnitなどの演算装置とその動作を規定するプログラムによって構成することもできる。以下では主にプログラムによってこれら機能部を構成した例を説明する。図2は、データ分割装置100がデータを分割する処理を記述したプログラムである。説明の便宜上、ステップ番号を併記した。以下、図2の各ステップについて説明する。図2:ステップ200データ分割装置100は、データ読取部110が読み取ったデータ全てに対して、以下のステップ210~223を実施する。データ全てに対して処理を終えていない場合は、startマーカを目印にして本ステップに戻り、同様の処理を繰り返す。データ読取部110が読み取ったデータは、変数blockStartが示すメモリアドレスから、変数blockEndが示すメモリアドレスの1つ手前のアドレスまでに、バイト列として格納されているものとする。図2:ステップ210分割条件判定部120は、blockEndblockStartblockMinが満たされる間、すなわちアドレスcPがデータブロックの末尾から最小ブロックサイズに相当する位置に達するまで、ステップ416からステップ421までの処理を繰り返す。図4:ステップ416~417これらのステップは、図2のステップ215~216と同様である。図4:ステップ418~419これらのステップは、図2のステップ217~218と同様である。ただし、分割条件判定部120は、第2分割条件pattern2と第3分割条件pattern3を判定する前に、アドレスcP2がセットされているか否か値が0を判定する。これは、本実施形態2ではデータブロックの末尾から先頭に向かってデータを読み取っていくため、最初に見つかったcP2の値が最もデータブロック末尾に近いからである。すなわち、できる限りデータブロックの末尾に近い位置でデータ分割するという観点では、cP2が既に見つかっていればその値を更新する必要はなく、cP2が空である場合に限り値をセットする必要があるからである。図4:ステップ420本ステップは、図2のステップ219と同様である。図4:ステップ421データ分割部130は、アドレスcPを1バイト後ろデータの先頭に向かう方向に進め、ステップ416に戻る。図4:ステップ423本ステップに到達した時点で変数cP2がセットされている場合、ステップ415~421のループ内では、第1判定条件に合致する位置が見つからず、第2判定条件に合致する位置のみが見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP2の間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStartcP2として、ステップ410に戻る。図4:ステップ424ステップ423で変数cP2がセットされていない場合、ステップ415~421のループ内では、第1判定条件と第2分割条件いずれも合致する位置が見つからなかったことになるので、分割後ブロックの最小サイズでデータブロックを分割する。データ分割部130は、アドレスblockStartとアドレスblockStartblockMinの間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、アドレスblockStartをblockMinだけインクリメントして、ステップ410に戻る。<実施の形態2:まとめ>以上のように、本実施形態2に係るデータ分割装置100は、データの終端から先頭に向かって順次データを読み取り、第2分割条件に該当するできるだけ終端に近い分割位置を変数cP2に保存しておく。ステップ423では、blockStartからcP2までのデータブロックをブロックDB300に書き込む。この処理手順により、最後に残ったcP2の値は、できる限りデータ終端に近い位置となる。また、データブロックが第1分割条件と第2分割条件いずれにも該当しない場合には、ステップ424で分割後ブロックの最小サイズblockMinのデータブロックをブロックDB300に格納するようにしている。これにより、重複排除に適していないデータブロックでも、少なくとも最小サイズblockMinのデータブロックを格納することになるので、最低限のデータ圧縮効果を発揮することができる。なお、ステップ424において、最大サイズblockMaxのデータブロックをブロックDB300に格納するようにしてもよい。これは、図2のステップ222と同様の処理を採用したものといえる。<実施の形態3>実施形態1~2では、第1分割条件と第2分割条件のみを用いているが、より多くの分割条件を判定するようにすることもできる。本発明の実施形態3では、第1分割条件、第2分割条件、第3分割条件のいずれかに該当する位置でデータを分割する。データ分割装置100の構成は実施形態1と同様であるため、以下では差異点を中心に説明する。図5は、本実施形態3に係るデータ分割装置100がデータを分割する処理を記述したプログラムである。ここでは、実施形態1の図2で説明したプログラムに加えて、第3分割条件に合致する位置でデータ分割する処理を新たに設けた例を示すが、実施形態2の図4で説明したプログラムに加えて第3判定条件を設けることもできる。以下、図2で説明したプログラムと異なる部分を中心に説明する。図5:ステップ512分割条件判定部120は、変数cP1、変数cP2、変数cP3を0で初期化する。変数cP3は、データを分割する条件である第3分割条件に該当するデータアドレスを保持するための変数である。図5:ステップ518分割条件判定部120は、特徴値hashが第3分割条件を満たす場合は、変数cP3に現在のデータアドレスcPをセットする。実施形態1~2では、第3分割条件に合致する場合は変数cP2にデータアドレスcPを格納しているため、第1分割条件と第2分割条件のうちいずれかを採用していた。本実施形態3では、この選択肢に加えて新たに第3分割条件を設けた点が異なる。図5:ステップ522データ分割部130は、変数cP3がセットされている0でないか否かを検査する。変数cP3がセットされていれば、ステップ518における第3分割条件を満たす位置が見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP3の間でデータをデータブロックに分割する。データ格納部140は、データブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStartcP3として、ステップ510に戻る。変数cP3がセットされていない場合はステップ523に進む。<実施の形態3:まとめ>以上のように、本実施形態3に係るデータ分割装置100は、第1分割条件、第2分割条件、第3分割条件の順に分割条件を判定し、いずれかに該当した位置でデータを分割する。これにより、実施形態1~2よりも細かな分割条件を設定することができる。<実施の形態4>本発明の実施形態4では、データブロックのハッシュ値に加えてデータブロックの固有識別番号をブロックDB300とバックアップ装置400に格納する動作例を説明する。これにより、ハッシュ値が衝突した場合でもブロックDB300やバックアップ装置400に格納しているデータを破壊しないようにすることを図る。その他の構成は実施形態1~3と同様であるため、以下では差異点を中心に説明する。図6は、本実施形態4においてデータ分割部130とデータ格納部140が実施する関数bdbの詳細処理フローを示す図である。以下、図6の各ステップについて説明する。図6:ステップS601本ステップは、図3のステップS301と同様である。図6:ステップS602データ格納部140は、データブロックを固有に識別する固有識別番号を、0で初期化する。図6:ステップS603データ格納部140は、ステップS601でデータ格納部140が求めたハッシュ値とデータブロックの固有識別番号をキーにして、同じ内容のデータブロックが既にブロックDB300へ登録されているか否かを検索する。図6:ステップS604ステップS603でキーが見つかった場合は、データ格納部140は対応するデータブロックをブロックDB300から取り出し、処理対象になっているデータブロックと同一内容であるか否か比較する。同一であればハッシュ値と固有識別番号をバックアップ装置400に出力し、本処理フローを終了する。同一でなければ固有識別番号を1つインクリメントしてステップS603に戻る。図6:ステップS605ステップS603でキーが見つからなかった場合は、データ格納部140はハッシュ値と固有識別番号をバックアップ装置400に出力し、データ格納部140はハッシュ値と固有識別番号をキーにしてデータブロックをブロックDB300に格納する。ブロックDB300に格納するデータブロックは、適当なアルゴリズムを用いて圧縮することが望ましい。<実施の形態4:まとめ>以上のように、本実施形態4に係るデータ分割装置100は、ハッシュ値が衝突する場合であっても、固有識別番号によってデータブロックを一意に識別することができる。これにより、ハッシュ値が衝突した場合でもブロックDB300やバックアップ装置400に格納しているデータを破壊しないようにすることができる。<実施の形態5>以上の実施形態1~4において、データ分割装置100は、データ読取部110がファイルサーバ200からデータを読み取った時点で、そのデータが圧縮または暗号化されているか否かを判断し、圧縮または暗号化されている場合は図2~図6で説明した処理を省略してそのデータをそのままブロックDB300に格納するようにしてもよい。圧縮または暗号化されているデータに対してさらに重複排除処理やデータ圧縮処理をしても、大きな効果は見込めないと考えられるからである。図2~図6で説明した処理を省略する場合は、データ全体を1つのデータブロックとして取り扱い、ハッシュ値はデータ全体に対して計算することになる。