2011-08-02 9 views
4

大きなファイルとの小さな違いが私のSubversionリポジトリが大きく成長する原因を突き止めることはできません。説明できないSVNリポジトリのサイズが小さい差分から大きなファイルに変更される

いくつかのテストで使用されたデータベースの内容のzipファイルがあります。新しいバージョンのテストデータをSubversionリポジトリに保存したい。

私はいくつかの実験を行いました。最後のいくつかのバージョンのdata.zipをチェックして、リポジトリのサイズに何が起こっているかを見てきました。圧縮されていないデータは約150MBで、圧縮されて圧縮されているのは約50MBです。リポジトリにチェックインされた新しいバージョンのdata.zipファイルは、リポジトリのサイズを約50MB増加させます。私はそれがずっと少ないと思うデルタの量だけ増やすべきだと思う。

Subversionはxdeltaを使用して圧縮された差分データを格納します。 SVNがうまくいくかどうかを確認する私の試みは、xdeltaをダウンロードして、2つのバージョンの間にあまり違いがないことを確認することでした。実際に

xdelta3.0z.x86-64.exe -e -s v1_path\data.zip v2_path\data.zip v1v2_delta.file 

約3MBのv1v2_delta.fileを生成しました。

私は[myrepo] \ DB \回転でSVNリポジトリに見てきたし、

02/08/2011 11:12  57,853,082 4189 
02/08/2011 11:40  51,713,289 4190 
02/08/2011 11:46  52,286,060 4191 

それぞれの新しいリビジョンのために大容量のファイルを見ることができる(4189、4190と4191は、ファイルの名前です。)

私は圧縮せずにdata.zipを圧縮しようとしました。これはSVNが保存しているものと違いはありませんでした。見た目からは、最初のものだけでなく、すべてのリビジョンのdata.zip全体を圧縮したものを保存していると思います。私はFSFSバックエンドでSVN 1.6を実行しています。

コミットバイナリとSVNがデルタをどのように格納するかについては、さまざまな良いスタックオーバーフローの回答があります。 SVN performance after many revisions。しかし、デルタが上記の場合に格納されていない理由、つまり、これらから私は見ることができません。 xdeltaがこのような小さな差分をスタンドアロンで実行できるのであれば、確かにSVNもできますか?そうではありませんか?

編集:私はtar(圧縮されていない)ファイルも試しましたが、SVNは効率的にそれらを保存していません。また私は、SVN が差分ファイルを保存した別のリポジトリに同じデータ形式のZIPファイル(はるかに小さい)があることを発見しました

この質問の要約版です:SVNは効率的にバイナリファイルを格納することができます。 10 slightly different CAD files are just 1.2 times the size of 1。 SVNは圧縮されたzipファイルで時にはスペース効率が良くなります。しかし、明らかにバイナリファイルのスペース効率が必ずしも良いとは言えません。

+0

「バイナリファイルの保存を避ける」については、 Windowsでは、特にゲームエディタの成果物やオフィスベースのドキュメントのリビジョンを保存する場合は避けられません。 "簡単に再生可能なバイナリファイルを保存するのを避ける"は、より適切です。 svnがバイナリデルタを使うことができるという事実は、他の自由に利用可能なソース管理システムとは別に、他の誰もこれを行うことができないため、設定します。ストレージ。 –

答えて

3

概要

Subversionが時々あるため圧縮に与えられているどのくらいのメモリのxdeltaのスタンドアロンよりも悪くなります。これはバージョン1.6の時点では現在変更できない破壊動作です。

詳細

私はSubversionのメーリングリストwhy the subversion repository files seemed to be bigger than they should beに尋ねました。

結論はxdelta can produce a smaller delta if you give it more memoryです。

このスレッドのリードバックanother example of someone else who had the same problem

最近、そして4年前に、これについてSubversionメーリングリストで様々な人々に感謝しています。

また、この問題がありますか?

サブバージョンリポジトリによるディスク使用状況を分析する場合は、skip deltasを理解し、このgrep DELTA trickを使用してデルタに使用されているベースを把握してください。

そして、私のように、あなたが本当にリポジトリにバイナリファイルを保存したいです、と仮定すると、ここでいくつかの回避策では私の推測です(非常に簡単にそれらのどれも!):

  1. は、Subversionのソースコードを変更し、構築します独自のXDELTAメモリウィンドウが大きくなるように設定して
  2. を行い、あなた自身のXDELTA-INGの - ソース管理にデルタをチェックし、Gitリポジトリへ
  3. 移行を再構成するためのいくつかのクレイジーろばのプロセスを持っている - より良い圧縮を持つようにバインドされています(野生投機)
1

私は圧縮がバイナリファイルの構成を完全に変更すると思うので、svnは巨大なデルタを保存しなければなりません。圧縮されたファイルの内容のいくつかの文字を変更するだけでそれを大幅に変更することができます。

ソース管理にバイナリを格納することは一般的には悪い考えであり、代替手段を探すべきだと思います。

+0

Re:圧縮はバイナリファイルを完全に変更しています。それはまさに私が思っていたものなので、圧縮せずに圧縮してみることです。しかし、いずれにしても、私が理解できないことは、コマンドラインからスタンドアロンを実行すると、xdeltaは小さなdiffを生成することができるということです。 SVNはxdeltaを使用すると、確かにそれはまた小さなdiffを達成する必要がありますか? –

+1

データベースを一切圧縮せずに圧縮されていない場合、どのような結果が得られますか? –

+0

未処理の形式では、データベースデータは膨大な数のフォルダファイルです。私はこれの最初のバージョンをコミットすることができます。しかし、2番目のバージョンをコミットするには、簡単に作業コピーを作成することはできません.2番目のバージョンを最初のファイルにドロップすることはできません。誰かが知っているトリックがない限り... ... –

-1

fsfsファイルシステムバッキングを使用しましたか?私が思い出すように、毎回新しいコピーを保存します(ただし、圧縮されている可能性があります)。なぜSVNがバイナリファイルの差分を保存することを期待していますか? SVNは、一般的なバイナリコントロールシステムではないソースコード管理システム(テキストを意味します)です(ただし、バイナリを格納するほどには悪影響を与えません)。

+0

Subversion 1.4以降、http://subversion.apache.org/docs/release-notes/1.4.html「Subversionはxdeltaアルゴリズムを使用してバイト列間の差異を計算します。バイナリファイルも。 –

+0

Subversionはすべてにデルタを使用します。ファイルがソースまたはバイナリであるかどうかはわかりません。これは、以前のレポリビジョン(FSFSを前提とする)に対するデルタを実行します。 –

1

圧縮されたアーカイブでファイルが追加または変更されると、圧縮ファイルのバイナリコンテンツが大幅に変更されることがあります。アーカイブの特定の要素で変更が発生する可能性があり、圧縮ファイルファイルの広い領域で大きな変更は起こらないと考えられます。しかし、これは通常の場合に当てはまる「運」の問題です(もちろん実際の運はありませんが、それを達成するためには少し複雑です)

これはかなり正常ですファイルが追加または変更されたときにシンボルの周波数が変化するので、ハフマン(最も簡単なものを指す)のようなエントロピー符号化アルゴリズム。これがアーカイブの内容の冒頭で行われる場合、変更後のファイルの内容全体に深刻な影響を与える可能性があります。

関連する問題