Skip to content

amru195704/UwView

Repository files navigation

UwView

日本語 | English

🌐 公式サイト概要ヘルプお問い合わせ)・ ブラウザで試す(WASMデモ) ・ 📰 プレスキット

4.9億行クラスの巨大テキストファイルを、省メモリ・高速に閲覧できるテキストビューア。(現在テストした最大行数:実際の行数限界はテストできない) 一応理論上は約920京行まで:人類未到なので数十年後にわかるか? おそらく現状の設定では5,500億行ぐらいが限界(設定で増加可能だが。。意味が無い) 実際ははDISKファイルサイズの上限まででしょう。きっと。

UwView — OSM日本 51GB・8.9億行を行モードで表示

かつて Vector で公開していた大容量テキストビューア UwView を、Avalonia UI で再作成するプロジェクトです。通常のエディタは100万行程度で開けなくなりますが、UwView はファイル全体をメモリに載せず、見えている行だけを描画することで巨大ファイルを実用的に閲覧できます。RDB/XML ダンプ等で発生する巨大行数ファイルを「とにかく速く見る」ことに特化しています。現在の最大行数テストは8.9億行(=OpenStreetMapの日本全体地図ソースで51Gbyte程度のxmlファイルです)。誰か限界を調査したら教えてください(できるものなら。私は怖くてできません)。

エディタではなく ビューア(閲覧専用)です。

📣 お知らせ:UwView Pro を発売しました(Windows・macOS・Linux 対応)

購入・詳細 → UwView Pro 製品ページ(買い切り $129 / 月額 $9)。Windows 10/11・macOS 11+(Apple Silicon / Intel)・Linux(x86_64)に対応(1ライセンスで全OS)。※Windows版は現在未署名(SmartScreenは〔詳細情報→実行〕)。

大容量ファイルをさらに高速化した UwView Pro を発売しました(Windows・macOS・Linux 対応)。索引の並列構築に加え、圧縮サイドカーキャッシュ.uwvz 単一ファイル・行索引内蔵・チェックサム保護)により「2回目以降の瞬間オープン」と「全文検索の大幅高速化」を実現します。

著名な大容量ログビューア klogg との実測比較(同一ファイル・同一パターン、3種類のストレージで検証):

条件: OpenStreetMap 日本全域 japan-latest.osm 47.73GB・892,239,125 行。MacBook Air / Apple M4(10コア)/ RAM 32GB。ストレージ実測帯域(dd): USB HDD 0.10GB/s / USB SSD 0.41GB/s / 内蔵SSD 3.29GB/s。klogg 24.11.0。検索のヒット数は全項目で klogg・UwView Pro・生ファイル直接検索の間で厳密一致を確認済み(=意味的に同じ検索であることを相互検証)。

項目 klogg (24.11.0) UwView Pro Pro ÷ klogg
初回オープン HDD 約9分 / USB SSD 約110秒 / 内蔵SSD 約15秒(毎回・完了まで先頭しか見えない) HDD 10.6分 / USB SSD 138.5秒 / 内蔵SSD 23.3秒(初回のみ・全域即表示・圧縮キャッシュ生成込み) 初回はやや遅い(対価は下記)
2回目以降のオープン 初回と同じ(毎回再索引) 0.01〜0.07秒 約1,250〜50,000倍
検索 literal "Tokyo" 約585秒 / 120〜135秒 / 15〜20秒 74.8秒 / 14.3秒 / 5.1秒 約7.8倍 / 約9倍 / 3〜4倍
検索 regex "Tok[yi]o" ≒literal(I/O律速でパターン非依存) USB SSD 29.8秒 / 内蔵SSD 11.0秒 約4.4倍 / 約1.5倍
ディスク占有(アーカイブ運用) 48GB(元ファイル必須) 5.3GB(元ファイル削除可・チェックサム保護付き) 1/9
  • klogg は索引作成中、先頭しか見えません(中間・末尾へ移動不可)。UwView はバイト位置ベース表示のため、開いた直後から全域へ自由に移動できます。
  • ディスクが遅いほど差が開きます(読むバイト数を1/9にするため)。HDD では検索10分→75秒。
  • 実作業サイズ(3GB・1億行)では検索はどちらも数秒以内で互角です。Pro の価値は「開き直すたびの再索引(klogg 47秒/8秒/2秒)が不要(数ms)」「元ファイルを消して 1/9〜1/13 サイズで保管・そのまま閲覧」という運用の差になります。
  • 初回オープンが klogg よりやや遅いのは圧縮キャッシュ生成込みのためで、この1回と引き換えに以後のオープン数ms・検索数秒・容量1/9が得られます。

UwView Pro は発売中です。 購入・詳細は 公式サイトの製品ページ へ(買い切り $129 / 月額 $9、Windows・macOS・Linux 対応・1ライセンスで全OS)。初回から開いた瞬間に全体を閲覧・検索でき(読み込み速度は無料版・他ツールと同等)、“2回目以降は行番号付きで瞬時・検索が速い・1/9で保管” が Pro の差です。

特長

  • 🚀 超高速な巨大ファイル表示 — 8.9億行クラスを省メモリで閲覧。ファイル本体は非常駐、索引は約6MB(2億行時)。
  • 📖 待たされないプログレッシブ・オープン — 開いた瞬間にページモードで即表示 → 裏で索引構築 → 完了で行モードへ昇格。
  • 🈁 文字コード自動判定 — BOM+UTF-8 / Shift-JIS / EUC-JP / UTF-16 を自動判別、手動切替も可能(索引再構築なし)。
  • 🗂 マルチファイル・タブ — 複数ファイルをタブで切替(状態保持で即時・各タブ独立に背景索引)。ドラッグ&ドロップ・複数選択で一括追加。
  • 🔎 文字列検索・正規表現 — 索引と独立の背景スキャン。literal はバイト列 SIMD 探索(2億行 3.4秒)、regex は行デコード後マッチ(同 12.7秒)。ヒットはバイトオフセット基準なのでページモード中・文字コード切替後も一貫。可視行のマッチ部ハイライトミニマップ(全体のヒット分布表示・クリックジャンプ)。
  • 🧵 検索結果一覧ポップアップ — 検索完了でヒットがあれば自動表示。ヒット行だけを別ウィンドウに一覧(元ファイル不変・仮想ビュー・元の行番号付き)。ダブルクリック/Enter で本文の該当行へジャンプ、前後±1行の文脈表示、結果は別ファイルへ保存可能(行番号の有無を選択)。Pro 版は前後±1000行の文脈とタブごとのウィンドウに対応。
  • 🎨 複数キーワードの色分けハイライタ(v1.1〜)— 検索とは独立に、登録した複数パターンを常時多色で着色(klogg の Highlighter 相当)。正規表現・大小無視・行全体/マッチ部・正規表現キャプチャ部のみ着色に対応。色覚に配慮した32色パレット、名前付きセットの保存、.uwvhl でのエクスポート/インポート。同梱プリセット7種(汎用ログレベル/syslog・Linux/Web access (HTTP)/JSON ログ/GNSS NMEA/GeoJSON/KML)。検索の黄ハイライトは常に最前面に残り、着色は可視行だけを都度評価するので巨大ファイルでも軽快。タブごとに別のハイライタを保持できます。
  • 🖱 選択語の右クリック着色(クイックカラーラベル)(v1.1.1〜)— 語を選んで右クリック → 色スウォッチで即着色(同じメニューに「コピー」「解除」「管理ダイアログ…」)。ダブルクリックは3段階(最短語 → 区切りの良いトークン → 解除)で対象範囲を選べます。着色した規則は管理ダイアログにも現れ、色変更・セット保存・.uwvhl 書き出しの対象になります。
  • 🕘 検索履歴・定義済みフィルタ(v1.1〜)— 検索ボックスは入力履歴のオートコンプリート(上限50)。よく使う検索は「★」で名前付き保存し、ドロップダウンから即実行できます。検索の次へ/前へ・行ジャンプは該当行を画面中央へ寄せ、行全体を強調します。
  • ブックマーク — 任意行をトグル・前後ジャンプ。バイトオフセット保持なので文字コード切替後も有効。ミニマップに青表示。
  • 📡 リアルタイム Tail — 追記を検知して mmap 再マップ+増分索引+末尾自動スクロール。他プロセスが書き込み中のログも開ける(FileShare.ReadWrite)。
  • 🖥 全OS同一描画 — Avalonia 独自 Skia 描画により Windows / macOS / Linux で見た目が一致。ブラウザ版は Noto Sans JP 同梱で日本語表示。
  • 💾 セッション復元・最近使ったファイル・お気に入り(v1.1.1〜)— 通常起動時に「前回のファイル(n件)を復元しますか?」を確認ダイアログで尋ね、OK で前回のタブ群を前回スクロール位置付近まで復元します。最近使ったファイル(上限15)とお気に入り(★トグル)はスタート画面(ファイル未オープン時)から開けます。ファイルを指定して起動したとき(ダブルクリック/D&D/CLI 引数)は、確認なしでそのファイルだけを開きます。

動作環境

  • .NET 10(global.json: 10.0.100 / rollForward latestFeature
  • Avalonia UI 12.x
  • 対応OS(優先): Windows / macOS / Linux(デスクトップ)
  • おまけ: ブラウザ(WASM)。ビルド/実行には wasm-tools ワークロードが必要(sudo dotnet workload install wasm-tools

アーキテクチャ

巨大ファイルの鉄則「ファイル全体をメモリに載せない/全行を UI に載せない」を4層で実現しています。

UI 層(TextView: 自前描画の仮想テキスト面)   … 可視行だけを Render で描画
      ↓ GetPageAt(byteOffset) / GetLine(lineIndex)
ドキュメント層(LineDocument)                … オンデマンド取得+LRUキャッシュ
      ↓
インデックス層(SparseLineIndex)             … N行ごと(既定256)のスパース索引で省メモリ
      ↓ Read(offset, length)
I/O 抽象層(IByteSource)                      … Desktop: mmap / Browser: Blob.slice
  • スパース行インデックス: 全行のオフセットを持つと2億行で約1.6GBになるため、256行ごとに1つだけ記録(約6MB)。任意行は直近チェックポイントから改行を数え直して求める。
  • I/O抽象 IByteSource: LengthRead(offset, buffer) だけの薄い抽象(+WASM 用の ReadAsync)。上位3層は I/O 実装を知らない。Desktop は mmap の同期経路、Browser は blob.slice の非同期経路+チャンクキャッシュ(256KB×64=16MB上限)を使う。

実測(フェーズ3受入・Apple Silicon Mac / 外付けSSD)

2億行・5.1GB の UTF-8 ファイル(UwView.Bench で計測):

項目 実測値 目標(§8)
open+文字コード判定 10 ms 即ページモード表示 ✓
ページモード表示(先頭50行+50%位置50行) 0 ms 索引を待たない ✓
索引構築(1回の順次読み) 9.7 s(538 MB/s) 進捗・キャンセル可 ✓
総行数 200,000,000(正確) 一致 ✓
索引サイズ チェックポイント781,251件 ≒ 6.0 MB 数MB ✓
マネージヒープ増 9.3 MB 数MB規模 ✓
GetLine ランダム1000回 平均 0.005 ms / p99 0.007 ms 体感即時(数ms) ✓
末尾(2億行目)ジャンプ 0.003 ms 正しい行が見える ✓
文字コード切替 0.9 ms・索引再構築なし 即反映 ✓
文字列検索 literal 3.4 s(1,521 MB/s) 背景・キャンセル可
文字列検索 regex 12.7 s(414 MB/s) 同上

※ WorkingSet は mmap のファイルページを含むため大きく見えるが、OS が随時回収する非常駐キャッシュでありアプリの割当メモリではない。

実データ検証(OSM 日本・51GB・8.9億行)

「2億行」を大きく超える実データでの検証。OpenStreetMap 日本全体を osmium で XML 化した japan-latest.osm(UTF-8)を使用(UwView の概要は 公開記事 参照)。

項目 実測値
サイズ 51,254,526,392 バイト(約48 GiB)
open+文字コード判定 12 ms
ページモード表示 3 ms(索引を待たない)
索引構築 172.8 s(283 MB/s・外付けSSD律速)
総行数 892,239,125wc -l と完全一致)
索引サイズ チェックポイント 3,485,310件 ≒ 26.6 MB
マネージヒープ増 33.3 MB
GetLine ランダム1000回 平均 1.28 ms / p99 3.0 ms
末尾(8.9億行目)ジャンプ 0.006 ms
  • 8.9億行超でも破綻せず、総行数は wc -l と1行の狂いもなく一致。末尾(8.9億行目)ジャンプも 0.006 ms。行番号は long 通し(int 上限≒21億にも収まる)。
  • GetLine が合成データ(0.005 ms)より遅い(1.28 ms)のは、外付けSSDのランダム読み・実XMLの行長不均一・51GBがキャッシュに載りきらない実I/Oが理由。ms級で実用範囲。
  • 常駐は索引26.6MB+ヒープ33MBのみ。行数よりストレージ容量が先に効く、という実データ特性が確認できた。

再計測:

dotnet run --project UwView.Bench -c Release -- <巨大テキストファイル>

プロジェクト構成

UwView/
├── UwView.slnx              ソリューション
├── global.json             .NET 10 固定
├── UwView.Core/            UI非依存のコア(テスト可能)
│   ├── IByteSource.cs           I/O抽象(Read/ReadAsync・INotifyDataArrived)
│   ├── MmapByteSource.cs        Desktop用 mmap 実装
│   ├── EncodingDetector.cs      文字コード・改行判定(同期/非同期)
│   ├── SparseLineIndex.cs       スパース行インデックス
│   ├── LineDocument.cs          行/ページのオンデマンド取得
│   └── DocumentSession.cs       1ファイル=1セッション(タブの実体)
├── UwView/                 Avalonia 共有UI
│   ├── Controls/TextView.cs     自前描画の仮想テキスト面(Activeセッションを描画)
│   ├── Services/IDocumentOpener.cs  「開く」のhead差し替え点(Desktop実装同居)
│   ├── ViewModels/              MainViewModel(タブ集合+Active)/ DocumentTabViewModel
│   └── Views/
├── UwView.Desktop/         Win/Mac/Linux head(★優先)
│   └── macos/                   UwView.app バンドル生成(build-app.sh)
├── UwView.Browser/         WASM head(おまけ)
│   ├── BlobByteSource.cs        blob.slice ランダム読み+チャンクキャッシュ
│   ├── BrowserDocumentOpener.cs JSファイル選択 → セッション生成
│   └── wwwroot/blobRead.js      JS 側(File保持・slice読み)
├── UwView.Bench/           フェーズ3実測ハーネス(索引時間・GetLine応答)
└── UwView.Core.Tests/      xUnit 検証

ビルドと実行

# 依存復元+ビルド
dotnet build

# デスクトップ版を起動(macOS の例)
dotnet run --project UwView.Desktop -c Debug

起動後、[開く…] からテキストファイルを選択すると閲覧できます。

  • ジャンプ: 行モードでは行番号、ページモードでは 50% のように割合を入力
  • 文字コード: ツールバーのドロップダウンで自動判定/手動切替
  • スクロール: ホイール・↑↓・PageUp/Down・Home/End・縦スクロールバー

テスト

dotnet test UwView.Core.Tests/UwView.Core.Tests.csproj

10万行の既知ファイルで行取得・総行数の正しさ、UTF-8 / Shift-JIS / EUC-JP / UTF-16 の判定、CRLF・末尾改行なし・空ファイルなどを検証します。

検証用の巨大ファイル生成例:

# 2億行・約5GB(空き容量に注意。まず1000万行程度で確認)
# 注意: macOS の seq は浮動小数点実装のため大きな範囲で「1e+07」表記や行数ズレを起こす。
#       awk の整数ループで生成すること。
awk 'BEGIN{for(i=1;i<=200000000;i++) printf "line %d テスト行\n", i}' > huge.txt
# Shift-JIS 版
iconv -f UTF-8 -t SHIFT_JIS huge.txt > huge_sjis.txt

実装状況

現在の安定版: v1.2.0(About 表示)。フェーズ0〜4(基盤・巨大ファイル閲覧)に加え、v1.1/v1.1.1 でログ解析向けの機能を追加し、v1.2.0 で UI の全面アイコン化と不具合修正(セッション復元ほか)を行いました。

  • フェーズ0: 足場(Avalonia ソリューション・Desktop 素ビルド)
  • フェーズ1: コアエンジン(IByteSource / mmap / 文字コード判定 / スパース索引 / 行・ページ取得)+ xUnit 検証
  • フェーズ2: UI(自前描画 TextView・ページモード先行・索引進捗・行モード昇格・文字コード手動切替)
  • フェーズ2.5: マルチファイル・タブ(DocumentSession・タブ集合+Active・開く/閉じる/切替/D&D・各タブ独立索引)
  • フェーズ3: 仕上げ(2億行実測=§8受入基準クリア・文字コード切替再索引なし確認・README/既知制限整備)
  • フェーズ4: WASM head(BlobByteSourceReadAsync 非同期経路・チャンクキャッシュ。ブラウザ起動確認済み)
  • §11-①: 文字列検索(SearchService・背景スキャン・バイトオフセット基準・進捗/キャンセル/上限100万件)
  • §11-②⑥: 検索ハイライト(可視行の再マッチ描画)+ミニマップ(ヒット分布・クリックジャンプ)
  • §11-③: リアルタイム Tail(ポーリング検知・mmap 再マップ・SparseLineIndex.ExtendAsync 増分索引・末尾追従)
  • §11-④: ブックマーク(バイトオフセット基準・トグル/前後ジャンプ・可視行マーカー+ミニマップ表示)
  • §11-⑤: 行フィルタ表示(ヒット行だけの仮想ビュー・元行番号表示・タブごとに状態保持)
  • WASM 日本語フォント同梱(Noto Sans JP / OFL。豆腐解消)
  • v1.1: 複数キーワードの色分けハイライタ(klogg §2 パリティ・正規表現/大小無視/キャプチャ着色・32色パレット・名前付きセット・.uwvhl 入出力・同梱プリセット5種)/検索履歴・定義済みフィルタ(上限50・★保存)/検索移動・行ジャンプの中央寄せ+行強調/検索結果一覧ポップアップの自動表示・前後±1文脈・保存
  • v1.1.1: 選択語の右クリック着色(クイックカラーラベル・3段階の語選択)/タブ別ハイライタ/色設定ダイアログの「保存・設定・キャンセル」整理/セッション復元・最近使ったファイル(上限15)・お気に入り・スタート画面/同梱プリセット拡充(GeoJSON・KML 追加=計7種
  • v1.2.0: ツールバー全面アイコン化(Material Icons・Apache-2.0)/セッション復元の不具合修正(バイトオフセット基準・ウィンドウを閉じる時に保存)/検索「次へ」の起点修正/検索件数を現在/総数表示・位置KB表示・起動ウィンドウ1200×720/日英の実行時切替(WASMの英語固定を解消)

ブラウザ版(WASM・おまけ)

# 初回のみ(要管理者権限): Skia のネイティブ再リンクに必要
sudo dotnet workload install wasm-tools

# 開発サーバーで起動(Chromium 系推奨)
dotnet run --project UwView.Browser

デスクトップ版と同じUI・同じコアが動きます。I/O は blob.slice によるランダム読み(ファイル全体はメモリに載せない)。

配布物(dist/

dist/ には各OS・アーキテクチャ向けにビルド済みの配布アーカイブを置いています。ソースはビルド生成物のため通常は .gitignore で除外していますが、このアーカイブ本体(.zip / .tar.gz)はインストール環境として追跡対象にしています。

ファイル 対象
UwView-macos-arm64.zip macOS(Apple Silicon)
UwView-macos-x64.zip macOS(Intel)
UwView-win-arm64.zip Windows(ARM64)
UwView-win-x64.zip Windows(x64)
UwView-linux-arm64.tar.gz Linux(ARM64)
UwView-linux-x64.tar.gz Linux(x64)

展開後、macOS 版は UwView.app をそのまま起動、Windows / Linux 版は同梱の実行ファイル(UwView.exe / UwView)を実行してください。macOS 版アプリバンドルの生成手順は UwView.Desktop/macos/build-app.sh を参照してください(Windows / Linux 版は dotnet publish -r <RID> --self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true で発行し、UwView.DesktopUwView にリネーム)。

署名について(無料版の開き方)

無料版 UwView はコード署名・公証を行っていません(無償OSSのため)。初回起動時に OS の警告が出ることがありますが、次の手順で開けます。

  • macOS: UwView.app を右クリック →「開く」→ 確認ダイアログでもう一度「開く」。以後は通常どおり起動できます(「開発元を検証できません」と出た場合の正規手順です)。
  • Windows: SmartScreen が出たら「詳細情報」→「実行」。
  • Linux: 実行権限を付与(chmod +x UwView./UwView)。

上位版 UwView Pro は Developer ID 署名・Apple 公証済みで、こうした警告なしに起動できます。

既知の制限

  • 改行スタイルは LF / CRLF を対象。CR単独(旧Mac)は現状フル対応していません。
  • UTF-16 は BOM 判定で認識しますが、行分割は \n(0x0A) バイト基準のため主対象は UTF-8 / Shift-JIS / EUC-JP です。
  • mmap は読み取り専用ビューのため、閲覧中に外部からファイルが切り詰められるとアクセス時に落ちる可能性があります(ビューアとして許容)。Tail は追記のみ対応(切り詰め・ローテーションは非対応)。
  • literal 検索の高速バイトパスは Shift-JIS でまれに文字境界をまたぐ誤ヒットがありえます(UTF-8 は構造上起きない)。厳密にしたい場合は正規表現モードを使ってください(デコード後にマッチ)。
  • ブラウザ版: 毎回ファイル選択が必要(パス直開き・D&D・Tail 不可)、索引構築はネイティブより遅い、描画は取得済みチャンクから行われるため未取得範囲は一瞬空白になり、届き次第再描画されます。

作者の関連プロダクト

UwView と同じ作者(y4u)が開発している、測量士・土地家屋調査士向けの iOS アプリ群です。

アプリ 内容 リンク
GeoConverter Pro 座標変換専用アプリ(世界測地系/平面直角座標系/セミダイナミック・定常補正対応) App Store公式サイト
GeoPrism JP 測地系のズレやジオイドを地図・ヒートマップで可視化する学習アプリ App Store公式サイト
GeoDiveExa RTK-GNSS 対応の高精度位置調査アプリ(原点となるメインアプリ) 公式サイト

UwView は上記 Geo 製品群とは独立した純粋なユーティリティで、Geo 資産への依存はありません。

ライセンス

UwView は PolyForm Internal Use License 1.0.0 で提供されます。

  • 個人利用、および企業の社内業務利用は無料です。
  • 本ソフトの再配布・製品/サービスへの組込み・転売・第三者への提供はできません。これらを行う場合は別途「商用(再配布)ライセンス」が必要です。
  • 商用ライセンスのお問い合わせ: GitHub Issues

日本語の参考訳: LICENSEjp.txt(法的効力を持つ正文は英語版 LICENSE)。

注意

自己責任でご利用ください。本ソフトを使用した結果いかなるトラブルが発生しても、作者は一切の責任を負いません。

About

Gigantic text & log viewer — view and search 890M-line / 51GB files from the moment you open them (indexing runs in the background). .NET 10 / Avalonia, macOS / Windows / Linux + WASM. 大容量テキスト/ログビューア

Topics

Resources

Stars

Watchers

Forks

Releases

Sponsor this project

Packages

Contributors

Languages