Skip to content

v1.15.0 — 日本語の、大きいファイル

Latest

Choose a tag to compare

@MR-TABATA MR-TABATA released this 05 Sep 13:48
· 1 commit to main since this release
6a6eee1

日本語の、大きいファイル

日本語の CSV は Shift-JIS・CRLF・引用符つきで届きます。これを検索するのに 1 行ずつ文字列へ変換していて、1GB で 26 秒かかっていました。しかも終わった合図がありませんでした。

1.06GB の CSV を絞り込んで、1 行編集して、保存する 24 秒

24 秒・カットなし・等倍。1.06GB・581万行の Shift-JIS CSV を絞り込んで、1 行編集して、保存するところまで。5 秒あたりで検索バーの「件数 · %」が動きます。

Shift-JIS の検索が 11 倍速くなりました

Shift-JIS 1.06GB・581万行 26.2 秒 2.40 秒
UTF-8 1.26GB 1.2 秒 1.23 秒

26 秒のほぼ全部が String(data:encoding:) を 581 万回呼ぶ費用でした。release ビルドにしても縮みません(自分のコードではなく Foundation 側の費用だからです)。

探す語のほうを Shift-JIS のバイト列にして、直接走査するようにしました。Shift-JIS は 2 バイト目が ASCII と重なるので(「ア」は 83 41、語 "A"41)、当たった位置が文字の切れ目に乗っているかを確かめて誤爆を弾いています。EUC-JP も同じ経路です。

検索が終わったことが画面に出ます

前は 1 件当たった瞬間に「13 件」へ切り替わり、まだ増え続けるのに確定したように見えていました。

走査中   208,887 件 · 25%
         1,365,744 件 · 56%
終わり   1,374,496 件中 2 件目

進み具合が消えたときが終わりです。

変わらないこと

保存したファイルは、編集した行の外が 1 バイトも変わりません。Shift-JIS も CRLF も引用符も BOM も、そのまま通り抜けます。形式を保持する処理は書いていません。


macOS 13+ / Apple Silicon・Intel 両対応(universal)/ MIT
Developer ID 署名・公証済みなので、右クリックは要りません。