バイナリファイル処理 svn vs. hg


Mercurial はバイナリファイル処理がいまいちという 噂をよく見るので,比べてみた。面倒臭いから, bsdusersに出したやつをpreで。

結果はMercurialの圧勝。ただ,メモリを食うので100MBを超えるような ファイルは,4〜5倍時間がかかっても subversion の方がいいかも。

下記註: 「容量比較」の項目について,
hgは,リポジトリと作業ディレクトリが同居しています。
du -sk hg はその合計値が出て,リポジトリ容量は hg/.hg のほうです。

----------------------------------------------------------------------
-rw-r--r--  2 yuuji  wheel  4190486 Mar  2 18:20 file1.tar.gz
という4MBのファイルを import & checkout
で実験。

●一発目の取り込み
[svn]
% time svn -m initial-import import $svn/file
Adding  (bin)  file1.tar.gz

Committed revision 1.
svn -m initial-import import $svn/file  2.39s user 0.06s system 97% cpu 2.520 total

[hg]
firestorm{yuuji}% time hg ci -m Initial-import            [/opt/tmp/scmtest/hg]
hg ci -m Initial-import  0.65s user 0.11s system 96% cpu 0.784 total

●チェックアウト後の容量
[svn]
firestorm{yuuji}% du -sk svn svnrepo                         [/opt/tmp/scmtest]
8248    svn
4186    svnrepo
合計:	12434	

[hg]
firestorm{yuuji}% du -sk hg                                  [/opt/tmp/scmtest]
8232    hg	(合計)
(うち hg/.hg は 4118)


●file1をちょびっと更新
-rw-r--r--  1 yuuji  wheel  4190544 Mar  2 18:27 file1.tar.gz
●コミット
[svn]
firestorm{yuuji}% time svn ci -m update-file1            [/opt/tmp/scmtest/svn]
Sending        file1.tar.gz
Transmitting file data .
Committed revision 2.
svn ci -m update-file1  0.89s user 0.11s system 81% cpu 1.232 total

[hg]
firestorm{yuuji}% time hg ci -m update-file1              [/opt/tmp/scmtest/hg]
hg ci -m update-file1  0.68s user 0.12s system 98% cpu 0.816 total

●容量比較
% cd ..
[svn]
% du -sk svn svnrepo                         [/opt/tmp/scmtest]
8248    svn	
7116    svnrepo
合計:	15364	(増加 2930)

[hg]
% du -sk hg                         [/opt/tmp/scmtest]
11192   hg
(うちhg/.hg は 7078 で 増加 2960)

●さらにfile1をちょびっと更新
-rw-r--r--  1 yuuji  wheel  4190555 Mar  2 18:42 file1.tar.gz
●コミット
[svn]
firestorm{yuuji}% time svn ci -m update-file1-2          [/opt/tmp/scmtest/svn]
Sending        file1.tar.gz
Transmitting file data .
Committed revision 3.
svn ci -m update-file1-2  0.79s user 0.13s system 67% cpu 1.362 total

[hg]
firestorm{yuuji}% time hg ci -m update-file1-2            [/opt/tmp/scmtest/hg]
hg ci -m update-file1-2  0.39s user 0.13s system 92% cpu 0.562 total

●容量比較
% cd ..
[svn]
% du -sk svn svnrepo                         [/opt/tmp/scmtest]
8248    svn
10046   svnrepo	(増加 2930)

[hg]
11208    hg
(うちhg/.hg は 7094 で 増加 16)

16kしか増えてないのはかなり効率的


●もっと大きなファイルを足してみよう
(116MBのファイル)
116 -rw-r--r--  1 yuuji  wheel  121057339 Mar 19  2006 ul-emacs.tar.bz2
% svn add --auto-props ul-emacs.tar.bz2  [/opt/tmp/scmtest/svn]
A  (bin)  ul-emacs.tar.bz2

[hg]
% hg add ul-emacs.tar.bz2                 [/opt/tmp/scmtest/hg]
ul-emacs.tar.bz2: files over 10MB may cause memory and performance problems
(use 'hg revert ul-emacs.tar.bz2' to unadd the file)

ん???? 10MB以上はダメ?

●コミット
% time svn ci -m 116MB-file-added        [/opt/tmp/scmtest/svn]
Adding  (bin)  ul-emacs.tar.bz2
Transmitting file data .
Committed revision 4.
svn ci -m 116MB-file-added  68.98s user 1.94s system 94% cpu 1:14.96 total

1分14秒…遅い

[hg]
firestorm{yuuji}% time hg ci -m 116MB-file-added          [/opt/tmp/scmtest/hg]
** unknown exception encountered, details follow
** report bug details to http://www.selenic.com/mercurial/bts
** or mercurial@selenic.com
** Mercurial Distributed SCM (version 0.9.5)
Traceback (most recent call last):
  File "/usr/local/mercurial/bin/hg", line 14, in ?
    mercurial.dispatch.run()

エラーでこけたーーーーーーーーーーー!
とおもったけど,limitを拡げたら通った。
% limit datasize
datasize        128MB
% limit datasize 666m
% limit datasize
datasize        666MB

●コミット
firestorm{yuuji}% time hg ci -m 116MB-file-added          [/opt/tmp/scmtest/hg]
hg ci -m 116MB-file-added  15.59s user 2.32s system 81% cpu 22.108 total

22秒。速い上に問題なし。	(svnは 74.96 total)


●容量比較
% cd ..
% du -sk svn svnrepo                         [/opt/tmp/scmtest]
244794  svn
128000  svnrepo

% du -sk hg                                  [/opt/tmp/scmtest]
365402  hg
(うち hg/.hg は 242920 で増加 117920)


●大きめのファイルをちょびっと変更(圧縮し直した)
116 -rw-r--r--  2 yuuji  wheel  121148496 Mar  2 19:15 ul-emacs.tar.bz2
●コミット
[svn]
% time svn ci -m 116MB-file-updateed        [/opt/tmp/scmtest/svn]
Sending        ul-emacs.tar.bz2
Transmitting file data .
Committed revision 5.
svn ci -m 116MB-file-updated  30.95s user 3.05s system 77% cpu 43.782 total
さっき(74秒)よりは速い

[hg]
こけたー,limit datasize 800m でやりなおし。
firestorm{yuuji}% time hg ci -m 116MB-file-updated        [/opt/tmp/scmtest/hg]
hg ci -m 116MB-file-updated  20.67s user 2.71s system 86% cpu 27.092 total

27秒。



●ではでかいファイル込でチェックアウト
firestorm{yuuji}% time svn co $svn/file svn-co-large         [/opt/tmp/scmtest]
A    svn-co-large/file1.tar.gz
A    svn-co-large/ul-emacs.tar.bz2
Checked out revision 5.
svn co $svn/file svn-co-large  33.32s user 1.96s system 76% cpu 46.207 total

firestorm{yuuji}% time hg clone hg  hg-clone-large           [/opt/tmp/scmtest]
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
hg clone hg hg-clone-large  3.88s user 2.60s system 61% cpu 10.545 total

4倍以上速い。

叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]