UwView シリーズ — 探す UwView・比べる UwDiff
2つのファイル・フォルダを比べるのは UwDiff、巨大なファイルを開いて探すのは UwView。どちらも Windows・macOS・Linux で動きます。→ UwView のベンチマーク
UwDiff の実測(1.0.0)
UwDiff(CLI uvd と画面)を、10GB × 2 本までのファイルで測った値です。どれも結果が正解と完全に一致することを確かめたうえでの時間で、出どころは GitHub の docs/benchmarks.md です。
[UwDiff のトップへ]
先に結論: CSV 10GB × 2 本のキー照合が 20.5〜23.3 秒、テキスト 10GB × 2 本が 20.7 秒。ただし、ほぼ全行が違う最悪の組は 110 秒、メモリを絞ると 58〜60 秒
負けと限界を先に書きます。
- テキストで、ほぼ全行が違う最悪の組(新を 4,096 行ごとに並べ替えた 10GB × 2 本)は 110 秒・メモリ 1.3GiB でした。行の並びがそろった組(20.7 秒)の約 5 倍です。
- 行の順番がばらばらの巨大な表は、相手を待つ行をメモリに持ちます(10GB × 2 本で 11.1〜11.5GiB)。メモリの上限を 476MB にすると一時ファイルへ逃がして止まらずに済みますが、58〜60 秒かかります。
- 1 か所で数百万行が入れ替わるような所は、その範囲を「置き換え」として出すことがあります(正しい差分ですが、最小とは限りません)。
- このページの値はキャッシュを消していない値です(データを作った直後に続けて実行)。10GB × 2 本はメモリに収まらないので cold に近いですが、1GB はキャッシュに載っている可能性があります。
測った環境
- Mac mini(Apple M4・10コア・メモリ 32GB)、macOS、データは外付け SSD
- uvd 1.0.0(.NET 10)。秒は
/usr/bin/timeの real、メモリは maximum resident set size - 測り方の決まり: 機種・ストレージを書く/OS をまたいで秒を比べない/1.5 倍未満の違いは「同等」とする
- 他の比較ツールとの比べはこのページには載せていません。
試験データ
tools/run_tests.sh と同じ試験データ(tools/testdata/uwdiff_gen2.c で作る。種は固定)。CSV の列は「点名,X,Y,Z,種別,測点番号,観測日,備考」。新は旧から、削除・追加・修正(1 行で 1〜7 セル・全部の列・値→空と空→値)・続いた行の塊(1〜128 行)・点名の変更・引用符の中の改行を入れて作ります。
新の行順は keep(旧と同じ)・local(4,096 行ごとに並べ替え)・shuffle(全部並べ替え)、文字コードは UTF-8(LF)・CP932(CRLF)です。
| 大きさ | 旧の行数 | 正解の差分の行数 |
|---|---|---|
| 1GB | 1,053 万 | 25.7 万 |
| 10GB | 1 億 534 万 | 255.9 万 |
表のキー照合(uvd 旧 新 -key 点名 -o 差分.csv)
| 大きさ × 2 本 | 行順 | UTF-8(秒) | CP932(秒) | メモリ |
|---|---|---|---|---|
| 1GB | keep/local/shuffle | 2.1/1.2/1.2 | 2.1/1.2/1.3 | 1.4〜2.1GiB |
| 10GB | keep | 21.8 | 20.5 | 4.0〜4.3GiB |
| 10GB | local | 21.8 | 12.9(※) | 3.6〜4.2GiB |
| 10GB | shuffle | 23.3 | 22.3 | 11.1〜11.5GiB |
| 10GB | shuffle・メモリ上限 476MB(一時ファイルへ逃がす) | 58 | 60 | 2.8GiB |
※ 直前に作ったデータがキャッシュに残っていた値。
テキストの比較(uvd 旧 新 -o 差分.diff・unified diff)
| 大きさ × 2 本 | 行順 | 時間(秒) | メモリ | 差分の行数(削除/追加) |
|---|---|---|---|---|
| 1GB | keep | 1.7 | 0.36GiB | 12.8 万/12.8 万 |
| 10GB | keep | 20.7 | 0.4GiB | 127 万/127 万 |
| 10GB | local(ほぼ全行が違う最悪の組) | 110 | 1.3GiB | 1 億 631 万/1 億 631 万 |
正しさ: 出した差分を旧に当てると新とバイト単位で一致することを、10GB でも確かめました。
画面(UwDiff)
| 比べるもの | 「比べる」から画面に出るまで(秒) | 最後の変更へ飛ぶ |
|---|---|---|
| テキスト 10GB × 2 本(keep・変更 116 万か所) | 20.5 | 27ms |
多数ファイル(uvd 旧フォルダ 新フォルダ -o 一覧.csv)
| フォルダ | 時間(秒) |
|---|---|
| 1 万本・片側 2.2GB(約 1% が違う・10 本ずつ旧だけ/新だけ) | 3.1(キャッシュに載った状態) |
再現のしかた
DATA=<試験データの置き場所> tools/run_tests.sh 1GB 10GB
10GB は試験データだけで約 90GB 使います。ソースと試験の道具は GitHub の UwDiff リポジトリにあります。
開発者より: アプリ・Kindle本・公開プロジェクトの一覧は GitHub: amru195704 にまとめています。