説明

データ分割プログラム

【課題】データ重複排除を実施しつつ、データ圧縮効率を高めることのできるデータ分割手法を提供する。
【解決手段】本発明に係るデータ分割プログラムは、データを分割する位置を判定する際に、データの終端により近い位置を優先して保存しておき、その位置でデータを分割する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データを分割するプログラムに関するものである。
【背景技術】
【0002】
コンピュータにデータを格納する際に、重複部分を排除してデータサイズを小さくする処理を施す場合がある。具体的には、データをブロックに分割し、バイト列が同一であるブロックを削除する。
【0003】
データに重複排除処理を施す例として、データをバックアップする処理が挙げられる。バックアップデータは継続的に蓄積する必要があるため、サイズが大きくなりやすく、したがって重複しているデータを削除するニーズがあるからである。その他、今後はストレージ装置そのものにも重複排除技術が適用される可能性がある。
【0004】
バックアップデータに対して重複排除処理を実施する場合、まずバックアップするファイルをブロックに分割し、ブロックのハッシュ値をキーとして、適当な手法で圧縮したブロックをバックアップメディアに退避する。また、バックアップデータを取り出すことを容易にするため、各ブロックのハッシュ値をバックアップデータとは別の記憶装置に保持しておく場合もある。
【0005】
重複排除処理の効果を高めるためには、データを分割して生成した各ブロック同士ができる限り同一となるようにすることが望ましい。そのため、重複排除処理を実施する際には、データをどの位置で分割するかという課題がともなう。
【0006】
下記特許文献1では、バイト列を先頭から末尾に向かって順次スキャンし、所定長のバイト列のハッシュ値が、あらかじめ定めておいた規定の数値パターンになった時点でバイト列を分割する。予備的な分割条件として、ハッシュ値が規定数値パターンに部分的に一致した場合にも、バイト列を分割することとしている。
【0007】
下記特許文献2では、バイト列の中に分割枠を設けておき、分割枠内の各分割位置候補の特徴値を求め、各特徴値を比較することにより、分割位置を決定している。
【0008】
下記特許文献3では、分割位置候補のオフセット、ハッシュ値、その他の特徴値を評価することにより、分割位置を決定している。
【0009】
下記特許文献4では、バイト列を何らかの方法で分割し、分割したバイト列内に、先に記憶装置へ書き込んだバイト列が含まれるか否かを、ハッシュ値によって判定している。これにより、記憶装置に書込済のバイト列については重複書込しないようにしている。
【0010】
下記非特許文献1では、データを遠隔コンピュータに複製する技術が記載されている。全データを一括して遠隔複製することは難しいため、対象データを適当な大きさに分割する必要がある。重複しているブロックは複製しなくともよいため、分割位置を適切に定めることにより、複製効率を向上させることができる。同文献では、データを固定長で分割するのではなく、可変長で分割し、重複するブロックを探している。
【先行技術文献】
【特許文献】
【0011】
【特許文献1】US 6,810,398 B2,2004,System and method for unorchestrated determination of data sequence using sticky byte factoring to determine breakpoints in digital sequences
【特許文献2】US 7,504,969 B2,2009,Location-based stream segmentation for data deduplication
【特許文献3】US 2006/0047855 A1,2006,Efficient Chunking Algorithm
【特許文献4】US 6,704,730 B1,2004,Hash file system and method for use in a commonality factoring system
【非特許文献】
【0012】
【非特許文献1】Andrew Tridgell,Efficient Algorithms for Sorting and Synchronization,Chapter 3 : The rsync algorithm,1999,学位論文,URL:http://samba.org/~tridge/phd_thesis.pdf(2011年1月11日取得)
【発明の概要】
【発明が解決しようとする課題】
【0013】
重複排除処理の効果を高めるためには、データをブロックに分割する際のブロックサイズをできる限り小さくしたほうがよいと考えられる。サイズが小さいブロックほど、他のブロックと一致する確率が高まるからである。
【0014】
一方で、データを圧縮する際には、圧縮前のデータサイズが大きいほど、圧縮効率がよいとされる。したがって、上述したバックアップの例のように、データをブロック毎に圧縮して保存する場合には、各ブロックサイズができる限り大きいほうがよいということになる。このことは、重複排除の効率を高めるために必要となる上記要件と相反している。
【0015】
重複排除とデータ圧縮は、ともに余分なデータを除去する目的があるので、総合的にデータサイズを小さくすることができる手法を優先すべきであると考えられる。特に上述したバックアップの例のように、重複排除とデータ圧縮を双方とも実施する場合には、上記のような相反する要求のバランスをとりつつ、総合的な効果としてデータサイズを小さくすることが肝要である。
【0016】
また、大容量のデータをバックアップする際には、バックアップ処理の効率も考慮する必要がある。分割ブロックのサイズを小さくすると、重複排除処理の効果は高まる反面、ブロックをバックアップメディアに格納する書込処理の回数が増えるため、結果としてバックアップ処理の時間が増大してしまう。
【0017】
以上のような理由から、データ重複排除とデータ圧縮のバランスをとることのできるデータ分割手法が望まれる。この点、上記特許文献1〜4および非特許文献1では、重複排除処理のみに着目しており、したがって分割ブロックサイズを大きくするという観点は記載されていない。以下、個別に説明する。
【0018】
非特許文献1では、あるブロックと重複するブロックを高速に探す方法を記載しているが、その前提として、重複するブロックが多くなるようにデータを分割することについては、明確には開示していない。
【0019】
特許文献1では、分割条件を複数設け、第1分割条件に該当する分割候補が見つけられなければ、予備的な第2分割条件に該当する位置でデータを分割している。しかし、第1分割条件および第2分割条件ともに、分割ブロックのサイズが大きくなるように明示的に構成されているわけではない。したがって、原則として重複排除処理の効率が高くなるように分割位置を定めるように動作すると思われる。
【0020】
特許文献2〜3でも、特許文献1と同様に分割ブロックのサイズが大きくなるとは限らない。また、複数の分割位置候補を比較するため、処理負荷が高く、処理効率が求められる用途には向かないと考えられる。
【0021】
特許文献4では、バイト列が書込済であるか否かを確認するために記憶装置から書込済データを読み取る必要があるので、記憶装置にアクセスする時間が長くなり、処理効率が高くないと考えられる。
【0022】
本発明は、上記のような課題を解決するためになされたものであり、データ重複排除を実施しつつ、データ圧縮効率を高めることのできるデータ分割手法を提供することを目的とする。
【課題を解決するための手段】
【0023】
本発明に係るデータ分割プログラムは、データを分割する位置を判定する際に、データの終端により近い位置を優先して保存しておき、その位置でデータを分割する。
【発明の効果】
【0024】
本発明に係るデータ分割プログラムでは、データ重複排除を実施するためのデータ分割を実施する過程で、データの終端により近い位置が優先的に用いられるので、データ圧縮の効果を高める方向に処理を振り向けつつ、データ重複排除を実施することができる。これにより、データ重複排除とデータ圧縮のバランスをとり、データサイズを小さくする効果を総合的に最適化することができる。また、これにより、バックアップ処理の時間を総合的に短縮することができる。
【図面の簡単な説明】
【0025】
【図1】実施形態1に係るデータ分割装置100の機能ブロック図である。
【図2】データ分割装置100がデータを分割する処理を記述したプログラムである。
【図3】データ格納部140が実施する関数bdbの詳細処理フローを示す図である。
【図4】実施形態2に係るデータ分割装置100がデータを分割する処理を記述したプログラムである。
【図5】実施形態3に係るデータ分割装置100がデータを分割する処理を記述したプログラムである。
【図6】実施形態4においてデータ分割部130とデータ格納部140が実施する関数bdbの詳細処理フローを示す図である。
【発明を実施するための形態】
【0026】
<実施の形態1>
図1は、本発明の実施形態1に係るデータ分割装置100の機能ブロック図である。データ分割装置100は、データを分割する処理を実施する装置であり、データ読取部110、分割条件判定部120、データ分割部130、データ格納部140を備える。
【0027】
データ読取部110は、ファイルサーバ200などのデータソースから、分割対象となるデータを読み取る。分割条件判定部120は、データ読取部110が読み取ったデータを順次取得し、データを分割する条件に該当するか否かを判定する。データ分割部130は、分割条件判定部120が判定した条件に該当する位置で、データをブロックに分割する。データ格納部140は、データ分割部130がデータ分割によって生成したデータブロックのハッシュ値を計算し、バックアップ装置400に格納する。また、データブロックとハッシュ値を対応付けてブロックDB300に格納する。
【0028】
ブロックDB300は、データ分割部130が元のデータを分割して生成したデータブロックを記憶するデータベースである。ブロックDB300は、ハードディスクなどの記憶装置を用いて構成することができる。バックアップ装置400は、データ格納部140が生成したハッシュ値を記憶する記憶装置である。
【0029】
データ読取部110、分割条件判定部120、データ分割部130、データ格納部140は、個別の機能部として構成することもできるし、一体的に構成することもできる。
【0030】
データ読取部110、分割条件判定部120、データ分割部130、データ格納部140は、これらの機能を実現する回路デバイスなどのハードウェアとして構成することもできるし、CPU(Central Processing Unit)などの演算装置とその動作を規定するプログラムによって構成することもできる。以下では主にプログラムによってこれら機能部を構成した例を説明する。
【0031】
図2は、データ分割装置100がデータを分割する処理を記述したプログラムである。説明の便宜上、ステップ番号を併記した。以下、図2の各ステップについて説明する。
【0032】
(図2:ステップ200)
データ分割装置100は、データ読取部110が読み取ったデータ全てに対して、以下のステップ210〜223を実施する。データ全てに対して処理を終えていない場合は、「start」マーカを目印にして本ステップに戻り、同様の処理を繰り返す。データ読取部110が読み取ったデータは、変数blockStartが示すメモリアドレスから、変数blockEndが示すメモリアドレスの1つ手前のアドレスまでに、バイト列として格納されているものとする。
【0033】
(図2:ステップ210)
分割条件判定部120は、blockEnd <= blockStartが成り立てば処理を終了する。blockStart変数は、以下のステップにおいて逐次更新される。本ステップは、分割対象であるバイト列の長さが0となったことを確認し、処理を終了すべきか否かを判断するためのものである。
【0034】
(図2:ステップ211)
分割条件判定部120は、blockEnd <= blockStart + blockMinが成り立つか否かを判断する。成り立つ場合、データ格納部140は、blockStartとblockEnd間のブロックをブロックDB300に書き込む。データ格納部140は、同じブロックのハッシュ値を計算し、バックアップ装置400に格納する。データ格納部140が実施する上記処理は、関数bdb内に記述されている。同関数の詳細は、後述の図3で改めて説明する。
【0035】
(図2:ステップ211:補足)
blockMinは、分割後ブロックの最小サイズである。したがって本ステップは、分割対象となるバイト列が最小サイズ以下になっているか否かを判定していることになる。対象バイト列が最小サイズ以下であれば、処理がデータの終端近くまで進んでおり、残りバイト列は僅かであることになるので、以下のステップを実施する意義はあまりない。そこで、残りバイト列についてはそのままブロックDB300に格納することとした。
【0036】
(図2:ステップ212)
分割条件判定部120は、変数cP1と変数cP2を0で初期化する。変数cP1は、データを分割する条件である第1分割条件に該当するデータアドレスを保持するための変数である。変数cP2は、データを分割する条件である第2分割条件に該当するデータアドレスを保持するための変数である。
【0037】
(図2:ステップ213)
分割条件判定部120は、分割位置を探す際に使用するアドレス変数cPを初期化する。最初の位置は、最小ブロックサイズに相当する位置よりも1バイト先のアドレスとする。以下、各機能部は、ファイルサーバ200から取得したデータを1バイトずつ順次読み取りながら、以下の処理を実施する。
【0038】
(図2:ステップ214)
分割条件判定部120は、cP < blockEndが満たされる間、すなわち、アドレス変数cPが分割対象データの最後に到達するまで、ステップ215〜223の処理を繰り返す。
【0039】
(図2:ステップ215)
分割条件判定部120は、分割条件に該当するか否かを判定するために用いる特徴値hashを求める。特徴値hashを求める処理は、関数crcに記述されている。関数crcの処理内容としては、任意の公知技術を用いることができる。
【0040】
(図2:ステップ215:補足)
関数crcの処理内容として、例えば指定されたアドレスから所定長手前のバイト列について巡回冗長検査値やハッシュ値を求め、その値を特徴値hashとして用いることが考えられる。
【0041】
(図2:ステップ216)
分割条件判定部120は、特徴値hashが第1分割条件を満たすか否かを検査する。第1分割条件は、関数pattern1に記述されている。特徴値hashが第1分割条件を満たす場合は、変数cP1に現在のデータアドレスcPをセットし、ステップ219に進む。第1分割条件を満たさない場合は、ステップ217へ進む。
【0042】
(図2:ステップ216:補足)
第1分割条件としては、例えば特徴値hashの部分ビットパターンが特定のビットパターンと一致するか否か、などが考えられる。その他、特徴値hashをある特定の値で割った余りが規定値に一致するか否か、などが考えられる。以下で説明する第2分割条件および第3分割条件も同様である。
【0043】
(図2:ステップ217)
分割条件判定部120は、特徴値hashが第2分割条件を満たすか否かを検査する。第2分割条件は、関数pattern2に記述されている。第2分割条件は、ステップ216における第1分割条件とは異なる条件とする。特徴値hashが第2分割条件を満たす場合は、変数cP2に現在のデータアドレスcPをセットし、ステップ219に進む。第2分割条件を満たさない場合は、ステップ218へ進む。
【0044】
(図2:ステップ218)
分割条件判定部120は、特徴値hashが第3分割条件を満たすか否かを検査する。第3分割条件は、関数pattern3に記述されている。第3分割条件は、ステップ216における第1分割条件およびステップ217における第2分割条件とは異なる条件とする。特徴値hashが第3分割条件を満たす場合は、変数cP2に現在のデータアドレスcPをセットする。
【0045】
(図2:ステップ219)
データ分割部130は、変数cP1がセットされている(0でない)か否かを検査する。変数cP1がセットされていれば、ステップ216で第1分割条件を満たす位置が見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP1の間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStart = cP1として、ステップ210に戻る。変数cP1がセットされていない場合はステップ220に進む。
【0046】
(図2:ステップ220)
データ分割部130は、アドレスcP(分割条件を判定している現アドレス)が、分割後ブロックの最大サイズに相当する位置(blockStart + blockMax)に達しているか否かを検査する。最大サイズに相当する位置に達していればステップ221に進み、達していなければステップ223にスキップする。
【0047】
(図2:ステップ221)
データ分割部130は、変数cP2がセットされている(0でない)か否かを検査する。変数cP2がセットされていれば、ステップ217における第2分割条件またはステップ218における第3分割条件を満たす位置が見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP2の間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStart = cP2として、ステップ210に戻る。変数cP2がセットされていない場合はステップ222に進む。
【0048】
(図2:ステップ222)
データ分割部130は、アドレスblockStartとアドレスcPの間でデータをデータブロック(ステップ220の条件により、分割ブロックの最大サイズとなっている)に分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStart = cPとして、ステップ210に戻る。
【0049】
(図2:ステップ223)
データ分割部130は、アドレスcPを1バイト前(データの終端に向かう方向)に進め、ステップ215に戻る。
【0050】
(図2:ステップ225)
データ分割部130は、アドレスblockStartとアドレスblockEndの間の残ったデータをデータブロックとして取り出す。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。本ステップは、分割後ブロックの最大サイズに相当する位置まで第1分割条件に該当する位置がみつからなかった場合の処理である。
【0051】
図3は、データ格納部140が実施する関数bdbの詳細処理フローを示す図である。以下、図3の各ステップについて説明する。
【0052】
(図3:ステップS301)
データ格納部140は、ブロックDB300に格納する対象となっているデータブロックのハッシュ値を計算する。衝突する確率が低いハッシュ関数を用いることが望ましい。例えば、SHA-1、SHA-256などのハッシュ関数を用いることができる。
【0053】
(図3:ステップS302)
データ格納部140は、ステップS301でデータ格納部140が求めたハッシュ値をキーにして、同じ内容のデータブロックが既にブロックDB300へ登録されているか否かを検索する。
【0054】
(図3:ステップS303)
ステップS302でキーが見つかった場合は、データ格納部140はハッシュ値をバックアップ装置400に出力し、本処理フローを終了する。
【0055】
(図3:ステップS304)
ステップS302でキーが見つからなかった場合は、データ格納部140はハッシュ値をバックアップ装置400に出力し、ハッシュ値をキーにしてデータブロックをブロックDB300に格納する。ブロックDB300に格納するデータブロックは、適当なアルゴリズムを用いて圧縮することが望ましい。
【0056】
(図3:ステップS303〜S304:補足)
これらステップにおいてハッシュ値をキーにしているのは、ステップS304でブロックDB300にデータブロックを格納する際に、データブロックを圧縮する場合があるからである。データブロックを圧縮してからブロックDB300に格納する場合、既にブロックDB300に格納されているデータブロックと新たなデータブロックが同一であるか否かは、圧縮を解かない限り分からないため、処理負担が重くなる。そこで、ハッシュ値が一致するか否かによって簡易的に同一判定できるようにしているのである。
【0057】
<実施の形態1:まとめ>
以上のように、本実施形態1に係るデータ分割装置100は、第2分割条件に該当するデータ位置のうち、データの終端にできる限り近い分割位置を優先してデータを分割するように構成されている。これにより、重複排除処理のためのデータ分割を実施しつつ、分割後のデータブロックサイズができる限り大きくなるように処理方針を方向付けていることになるので、結果としてデータ重複排除とデータ圧縮をバランスよく両立させることができる。
【0058】
具体的には、第1分割条件に該当する分割位置が見つからない場合には、第2分割条件に該当するできるだけ終端に近い分割位置を変数cP2に保存しておき、ステップ221でblockStartからcP2までのデータブロックをブロックDB300に書き込む。この処理手順により、最後に残ったcP2の値は、できる限りデータ終端に近い位置となる。
【0059】
また、データブロックが第1分割条件と第2分割条件いずれにも該当しない場合には、ステップ222で分割後ブロックの最大サイズblockMaxのデータブロックをブロックDB300に格納するようにしている。これにより、重複排除に適していないデータブロックはデータ圧縮を優先してできる限り大きなサイズのデータブロックを格納することになるので、重複排除効果を発揮できないとしても、データ圧縮効果でこれを補い、総合的にデータサイズを小さくすることができる。
【0060】
<実施の形態2>
本発明の実施形態2では、実施形態1と同様にできる限りデータ終端に近い位置でデータを分割する手法を説明する。本実施形態2では、分割するデータを終端から先頭に向かって順次読み取り、分割条件に合致した時点でデータを分割する。データ分割装置100の構成は実施形態1と同様であるため、以下では差異点を中心に説明する。
【0061】
図4は、本実施形態2に係るデータ分割装置100がデータを分割する処理を記述したプログラムである。説明の便宜上、ステップ番号を併記した。以下、図4の各ステップについて説明する。
【0062】
(図4:ステップ400〜412)
これらのステップは、図2のステップ200〜212と同様である。
【0063】
(図4:ステップ413)
分割条件判定部120は、blockStart + blockMax <= blockEndが成立する場合は、分割位置を探す際に使用するアドレス変数cPを、分割後ブロックの最大サイズに相当する位置に初期化する。
【0064】
(図4:ステップ414)
分割条件判定部120は、ステップ413の条件式が成立しない場合は、変数cPをデータブロックの末尾位置に初期化する。
【0065】
(図4:ステップ413〜414:補足)
これらのステップでは、条件判定する位置cPを、データブロックのできるだけ後方の位置に初期設定していることになる。
【0066】
(図4:ステップ415)
分割条件判定部120は、cP >= blockStart + blockMinが満たされる間、すなわちアドレスcPがデータブロックの末尾から最小ブロックサイズに相当する位置に達するまで、ステップ416からステップ421までの処理を繰り返す。
【0067】
(図4:ステップ416〜417)
これらのステップは、図2のステップ215〜216と同様である。
【0068】
(図4:ステップ418〜419)
これらのステップは、図2のステップ217〜218と同様である。ただし、分割条件判定部120は、第2分割条件pattern2と第3分割条件pattern3を判定する前に、アドレスcP2がセットされているか否か(値が0)を判定する。これは、本実施形態2ではデータブロックの末尾から先頭に向かってデータを読み取っていくため、最初に見つかったcP2の値が最もデータブロック末尾に近いからである。すなわち、できる限りデータブロックの末尾に近い位置でデータ分割するという観点では、cP2が既に見つかっていればその値を更新する必要はなく、cP2が空である場合に限り値をセットする必要があるからである。
【0069】
(図4:ステップ420)
本ステップは、図2のステップ219と同様である。
【0070】
(図4:ステップ421)
データ分割部130は、アドレスcPを1バイト後ろ(データの先頭に向かう方向)に進め、ステップ416に戻る。
【0071】
(図4:ステップ423)
本ステップに到達した時点で変数cP2がセットされている場合、ステップ415〜421のループ内では、第1判定条件に合致する位置が見つからず、第2判定条件に合致する位置のみが見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP2の間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStart = cP2として、ステップ410に戻る。
【0072】
(図4:ステップ424)
ステップ423で変数cP2がセットされていない場合、ステップ415〜421のループ内では、第1判定条件と第2分割条件いずれも合致する位置が見つからなかったことになるので、分割後ブロックの最小サイズでデータブロックを分割する。データ分割部130は、アドレスblockStartとアドレスblockStart + blockMinの間でデータをデータブロックに分割する。データ格納部140は、そのデータブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、アドレスblockStartをblockMinだけインクリメントして、ステップ410に戻る。
【0073】
<実施の形態2:まとめ>
以上のように、本実施形態2に係るデータ分割装置100は、データの終端から先頭に向かって順次データを読み取り、第2分割条件に該当するできるだけ終端に近い分割位置を変数cP2に保存しておく。ステップ423では、blockStartからcP2までのデータブロックをブロックDB300に書き込む。この処理手順により、最後に残ったcP2の値は、できる限りデータ終端に近い位置となる。
【0074】
また、データブロックが第1分割条件と第2分割条件いずれにも該当しない場合には、ステップ424で分割後ブロックの最小サイズblockMinのデータブロックをブロックDB300に格納するようにしている。これにより、重複排除に適していないデータブロックでも、少なくとも最小サイズblockMinのデータブロックを格納することになるので、最低限のデータ圧縮効果を発揮することができる。
【0075】
なお、ステップ424において、最大サイズblockMaxのデータブロックをブロックDB300に格納するようにしてもよい。これは、図2のステップ222と同様の処理を採用したものといえる。
【0076】
<実施の形態3>
実施形態1〜2では、第1分割条件と第2分割条件のみを用いているが、より多くの分割条件を判定するようにすることもできる。本発明の実施形態3では、第1分割条件、第2分割条件、第3分割条件のいずれかに該当する位置でデータを分割する。データ分割装置100の構成は実施形態1と同様であるため、以下では差異点を中心に説明する。
【0077】
図5は、本実施形態3に係るデータ分割装置100がデータを分割する処理を記述したプログラムである。ここでは、実施形態1の図2で説明したプログラムに加えて、第3分割条件に合致する位置でデータ分割する処理を新たに設けた例を示すが、実施形態2の図4で説明したプログラムに加えて第3判定条件を設けることもできる。以下、図2で説明したプログラムと異なる部分を中心に説明する。
【0078】
(図5:ステップ512)
分割条件判定部120は、変数cP1、変数cP2、変数cP3を0で初期化する。変数cP3は、データを分割する条件である第3分割条件に該当するデータアドレスを保持するための変数である。
【0079】
(図5:ステップ518)
分割条件判定部120は、特徴値hashが第3分割条件を満たす場合は、変数cP3に現在のデータアドレスcPをセットする。実施形態1〜2では、第3分割条件に合致する場合は変数cP2にデータアドレスcPを格納しているため、第1分割条件と第2分割条件のうちいずれかを採用していた。本実施形態3では、この選択肢に加えて新たに第3分割条件を設けた点が異なる。
【0080】
(図5:ステップ522)
データ分割部130は、変数cP3がセットされている(0でない)か否かを検査する。変数cP3がセットされていれば、ステップ518における第3分割条件を満たす位置が見つかっていることになる。データ分割部130は、アドレスblockStartとアドレスcP3の間でデータをデータブロックに分割する。データ格納部140は、データブロックをブロックDB300に書き込む。データ格納部140は、同じデータブロックのハッシュ値を計算し、バックアップ装置400に書き込む。データ分割部130は、blockStart = cP3として、ステップ510に戻る。変数cP3がセットされていない場合はステップ523に進む。
【0081】
<実施の形態3:まとめ>
以上のように、本実施形態3に係るデータ分割装置100は、第1分割条件、第2分割条件、第3分割条件の順に分割条件を判定し、いずれかに該当した位置でデータを分割する。これにより、実施形態1〜2よりも細かな分割条件を設定することができる。
【0082】
<実施の形態4>
本発明の実施形態4では、データブロックのハッシュ値に加えてデータブロックの固有識別番号をブロックDB300とバックアップ装置400に格納する動作例を説明する。これにより、ハッシュ値が衝突した場合でもブロックDB300やバックアップ装置400に格納しているデータを破壊しないようにすることを図る。その他の構成は実施形態1〜3と同様であるため、以下では差異点を中心に説明する。
【0083】
図6は、本実施形態4においてデータ分割部130とデータ格納部140が実施する関数bdbの詳細処理フローを示す図である。以下、図6の各ステップについて説明する。
【0084】
(図6:ステップS601)
本ステップは、図3のステップS301と同様である。
【0085】
(図6:ステップS602)
データ格納部140は、データブロックを固有に識別する固有識別番号を、0で初期化する。
【0086】
(図6:ステップS603)
データ格納部140は、ステップS601でデータ格納部140が求めたハッシュ値とデータブロックの固有識別番号をキーにして、同じ内容のデータブロックが既にブロックDB300へ登録されているか否かを検索する。
【0087】
(図6:ステップS604)
ステップS603でキーが見つかった場合は、データ格納部140は対応するデータブロックをブロックDB300から取り出し、処理対象になっているデータブロックと同一内容であるか否か比較する。同一であればハッシュ値と固有識別番号をバックアップ装置400に出力し、本処理フローを終了する。同一でなければ固有識別番号を1つインクリメントしてステップS603に戻る。
【0088】
(図6:ステップS605)
ステップS603でキーが見つからなかった場合は、データ格納部140はハッシュ値と固有識別番号をバックアップ装置400に出力し、データ格納部140はハッシュ値と固有識別番号をキーにしてデータブロックをブロックDB300に格納する。ブロックDB300に格納するデータブロックは、適当なアルゴリズムを用いて圧縮することが望ましい。
【0089】
<実施の形態4:まとめ>
以上のように、本実施形態4に係るデータ分割装置100は、ハッシュ値が衝突する場合であっても、固有識別番号によってデータブロックを一意に識別することができる。これにより、ハッシュ値が衝突した場合でもブロックDB300やバックアップ装置400に格納しているデータを破壊しないようにすることができる。
【0090】
<実施の形態5>
以上の実施形態1〜4において、データ分割装置100は、データ読取部110がファイルサーバ200からデータを読み取った時点で、そのデータが圧縮または暗号化されているか否かを判断し、圧縮または暗号化されている場合は図2〜図6で説明した処理を省略してそのデータをそのままブロックDB300に格納するようにしてもよい。圧縮または暗号化されているデータに対してさらに重複排除処理やデータ圧縮処理をしても、大きな効果は見込めないと考えられるからである。
【0091】
図2〜図6で説明した処理を省略する場合は、データ全体を1つのデータブロックとして取り扱い、ハッシュ値はデータ全体に対して計算することになる。
【符号の説明】
【0092】
100:データ分割装置、110:データ読取部、120:分割条件判定部、130:データ分割部、140:データ格納部、200:ファイルサーバ、300:ブロックDB、400:バックアップ装置。

【特許請求の範囲】
【請求項1】
データを分割する処理をコンピュータに実行させるプログラムであって、
前記コンピュータに、
前記データを所定の読取単位毎に順次読み取る読取ステップ、
前記読取ステップで読み取ったデータが、データを分割する条件に該当するか否かを判定してそのデータ位置を取得する判定ステップ、
前記データが前記条件に該当する位置で前記データを分割する分割ステップ、
を実行させ、
前記判定ステップでは、前記コンピュータに、
前記読取ステップで読み取ったデータが、データを分割する条件である第1分割条件に該当するか否かを判定する第1判定ステップ、
前記読取ステップで読み取ったデータが前記第1分割条件に該当しない場合は、前記読取ステップで読み取ったデータが、データを分割する条件である第2分割条件に該当するか否かをさらに判定する第2判定ステップ、
を実行させ、
前記第2判定ステップは、
前記データの終端により近い位置を前記判定ステップの結果として優先的に用いるように構成されている
ことを特徴とするデータ分割プログラム。
【請求項2】
前記分割ステップで分割した後のデータの上限サイズをあらかじめ規定するステップを前記コンピュータに実行させ、
前記読取ステップでは、前記コンピュータに、
前記データを先頭から終端に向かって順次読み取らせ、
前記データ分割ステップでは、前記コンピュータに、
前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しなかった場合は、前記上限サイズで前記分割ステップを実行させる
ことを特徴とする請求項1記載のデータ分割プログラム。
【請求項3】
前記分割ステップで分割した後のデータの下限サイズをあらかじめ規定するステップを前記コンピュータに実行させ、
前記読取ステップでは、前記コンピュータに、
前記データを終端から先頭に向かって順次読み取らせ、
前記データ分割ステップでは、前記コンピュータに、
前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しなかった場合は、前記下限サイズで前記分割ステップを実行させる
ことを特徴とする請求項1記載のデータ分割プログラム。
【請求項4】
前記判定ステップでは、前記コンピュータに、
前記読取ステップで読み取ったデータが前記第1分割条件および前記第2分割条件のいずれにも該当しない場合は、前記読取ステップで読み取ったデータが、データを分割する条件である第3分割条件に該当するか否かをさらに判定する第3判定ステップを実行させ、
前記分割ステップでは、前記コンピュータに、
前記第1分割条件、前記第2分割条件、または前記第3分割条件のいずれかに該当した位置で前記データを分割させ、
前記第3判定ステップは、
前記データの終端により近い位置を前記判定ステップの結果として優先的に用いるように構成されている
ことを特徴とする請求項1から3のいずれか1項記載のデータ分割プログラム。
【請求項5】
前記分割ステップで分割したデータをそのデータのハッシュ値と対応付けて記憶装置に格納する格納ステップを前記コンピュータに実行させる
ことを特徴とする請求項1から4のいずれか1項記載のデータ分割プログラム。
【請求項6】
前記格納ステップでは、前記コンピュータに、
前記分割ステップで分割した前記データを固有に識別する番号を前記ハッシュ値と対応付けて前記記憶装置に格納させる
ことを特徴とする請求項5記載のデータ分割プログラム。
【請求項7】
前記データが圧縮済みまたは暗号化されているか否かを判断するステップ、
前記データが圧縮済みまたは暗号化されている場合は、前記読取ステップ、前記判定ステップ、前記分割ステップ、および前記格納ステップを省略し、前記データをそのハッシュ値と対応付けて記憶装置に格納する処理のみを実行するステップ、
を前記コンピュータに実行させる
ことを特徴とする請求項5または6記載のデータ分割プログラム。
【請求項8】
前記格納ステップでは、前記コンピュータに、
前記データまたは前記分割ステップで分割した前記データを圧縮して記憶装置に格納させる
ことを特徴とする請求項5から7のいずれか1項記載のデータ分割プログラム。
【請求項9】
データを分割する装置であって、
前記データを所定の読取単位毎に順次読み取る読取部と、
前記読取部が読み取ったデータが、データを分割する条件に該当するか否かを判定する分割条件判定部と、
前記データが前記条件に該当する位置で前記データを分割する分割部と、
を備え、
前記分割条件判定部は、
前記読取部が読み取ったデータが、データを分割する条件である第1分割条件に該当するか否かを判定し、
前記読取部が読み取ったデータが前記第1分割条件に該当しない場合は、前記読取部が読み取ったデータが、データを分割する条件である第2分割条件に該当するか否かをさらに判定し、
前記分割条件判定部は、
前記データが第2分割条件に該当するか否かを判定する際に、前記データの終端により近い位置を優先的に用いる
ことを特徴とするデータ分割装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2012−164130(P2012−164130A)
【公開日】平成24年8月30日(2012.8.30)
【国際特許分類】
【出願番号】特願2011−23960(P2011−23960)
【出願日】平成23年2月7日(2011.2.7)
【出願人】(000233055)株式会社日立ソリューションズ (1,610)
【Fターム(参考)】