0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gduの容量データをJevに渡して、ディスクの掃除候補を提案させてみた

0
Posted at

ディスクを整理するとき、大きなディレクトリを見つけても、どこから手をつければよいか調べるのが面倒でした。キャッシュなのか、作業に必要なデータなのかを一つずつ確認する前に、ある程度の見当をつけてもらいたいと思い、Jevで試してみました。

容量を調べる部分にはgduを使い、その結果をJevへ渡します。「掃除候補」「保持推奨」「要確認」を表示し、実際に整理するかどうかは人間が判断する想定です。今回はこの流れを確認するためのPoCとして作りました。

gduで容量をJSONとして取得する

gduは、ディレクトリやファイルのディスク使用量を調べるGo製のCLIです。計測結果をJSONで取得できるので、この出力をJevへの入力の元にしました。

macOSではHomebrewからインストールできます。

brew install gdu

GNU coreutilsのgduとの衝突を回避するため、Homebrewではgdu-goという名前でインストールされます。

ホームディレクトリの計測結果をJSONに保存するコマンドは、次のとおりです。

gdu-go --no-progress --no-cross --output-file scan.json -- ~/

出力は、形式のバージョン、メタデータ、ディレクトリツリーを並べたJSON配列になっています。ディレクトリは「自身の情報と子要素を並べた配列」、ファイルは情報オブジェクトとして表現されます。

[
  1,
  2,
  { "progname": "gdu", "progver": "v5.37.0" },
  [
    { "name": "/Users/demo/projects/example", "dsize": 4294967296, "asize": 4294967296 },
    { "name": "package.json", "dsize": 4096, "asize": 512 },
    { "name": "package-lock.json", "dsize": 4096, "asize": 2048 },
    [
      { "name": "node_modules", "dsize": 4294959104, "asize": 4294964736, "items": 6000, "mtime": 1787000000 }
    ]
  ]
]

容量の大きな項目を選び、1件ずつのデータにする

このツリーを全部Jevに渡すと、容量の小さな項目まで大量に入ってしまいます。そこでローカルで、100 MiB以上の項目から容量の大きい順に最大50件を選びます。

ホームやプロジェクト全体のような大きな親ディレクトリは、子へ分解して見ます。node_modulesやCaches、DerivedDataなどは、ひとまとまりの候補として扱います。

選んだ項目について、親子関係からフルパスを組み立てます。Jevに渡す情報は、そのパスとディスク使用量だけにしました。

Jevへ渡すstateは、候補1件についてのJSONオブジェクトです。

{
  "path": "/Users/demo/projects/example/node_modules",
  "disk_bytes": 4294959104
}

Jevには用途と再生成可能性を聞く

Jevは、状態と型の決まった質問を入力すると、判定を返すモデルです。今回は固定の選択肢から選ぶChoiceを使いました。

同じ候補に対して、次の2つを聞きます。

質問 選択肢
この項目の用途は何か キャッシュ、ビルド成果物、依存関係、個人データ、設定・認証情報、その他、不明
この項目は再生成できそうか 再生成可能、固有データ、不明

候補1件を1回のAPIリクエストにし、その中に2問をまとめました。リクエストには、入力データのstate、質問のquestions、使用モデルのmodelを含めます。

questionsには、質問の種類を表すtype、質問文のinstructions、選択肢と説明のcriteriaを入れます。説明には、キャッシュとアプリの永続データを区別することや、古い・大きいという理由だけで不要と判断しないことを書いています。判断材料が足りない場合に選べるよう、両方の質問に「不明」も用意しました。

返ってくるのは、選んだchoice、選択肢別のprobabilities、confidenceです。

回答を整理の目安として表示する

2つの回答を、次の条件で表示へ変換します。

条件 表示
どちらかのconfidenceが0.85未満 要確認
個人データ・設定、または固有データと分類 保持推奨
キャッシュ・成果物・依存関係で、再生成可能と分類 掃除候補
その他・不明 要確認

0.85は今回のPoCで置いた閾値です。

用途と再生成可能性を分けておくと、「キャッシュには見えるが、再生成できるかは判断が弱い」といった結果も表示に反映できます。説明文は分類から組み立てた定型文です。

実際に動かしてみた

パスとディスク使用量だけを入力にして、実機で試しました。

ホームディレクトリを対象に、まず容量計測とJevへの入力プレビューを確認しました。

実機では約534万項目、ディスク使用量約386 GiBを計測し、50件の入力データを作成できました。容量計測と入力データの作成には約48.0秒かかりました。

指定モデルはjev-latest、応答のモデル名はjev-1.13.0でした。結果は次のとおりです。

表示 件数
掃除候補 15
保持推奨 3
要確認 32

代表的な項目を抜き出すと、以下のようになりました。記事ではパスの末尾だけを掲載していますが、APIには元のフルパスを渡しています。分類とconfidenceは実際の応答の値です。

項目 用途とconfidence 再生成可能性とconfidence 表示
Caches キャッシュ:1.00 再生成可能:0.96 掃除候補
node_modules 依存関係:1.00 再生成可能:1.00 掃除候補
.venv 依存関係:0.99 再生成可能:0.99 掃除候補
写真 個人データ:1.00 固有データ:0.85 保持推奨
Backup 個人データ:1.00 固有データ:0.91 保持推奨
.gradle キャッシュ:0.87 再生成可能:1.00 掃除候補
data.img.raw 個人データ:0.44 再生成可能:0.66 要確認

.gradleはキャッシュかつ再生成可能と分類され、両方のconfidenceが閾値以上だったため掃除候補になりました。一方、大きなディスクイメージのdata.img.rawは、用途と再生成可能性のどちらもconfidenceが低く、要確認になっています。

この試行では50件の候補に対して100問を送り、50件すべてでAPIの回答を取得できました。応答のusageの合計は、入力トークン34,589、出力トークン5,645でした。

保存済み入力の評価は3並列で行い、約3.1秒でした。これはgduの計測時間を含まず、APIへの問い合わせと表示用データの作成にかかった時間です。

試してみた感想

今回やったことは、gduのツリーから容量の大きい項目を取り出して、パスと容量を1件の状態にまとめ、Jevで用途と再生成可能性を分類する、というものです。

「大きい順」の一覧に用途の見当が加わると、自分で確認する順番を考える材料になりそうだと感じました。実データでも、キャッシュやnode_modulesは掃除候補、写真やバックアップは保持推奨という分類が返りました。

一方で、50件中32件は要確認でした。パスと容量だけでは判断しにくい項目も多く、今回は「消してよいものを確定する」よりも、「先に確認する候補を絞る」という使い方に合いそうです。今回の分類は正解ラベルと照合していないので、精度を測った結果ではありません。次は要確認の項目を自分で見て、この分類が確認する順番を考えるのに役立つかを確かめたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?