240GB の SSD に Lightroom のカタログを移動した。今まで OS が入っているシステムドライブにそのまま置いていたが、カタログ、とくにプレビューが大きく容量を圧迫していたため、これを解消することを目的とする。

カタログと Time Machine

カタログに付随するものとして Previews.lrdata と Smart Previews.lrdata があり、カタログ自体よりもこれらの容量が支配的になる。しかしこれは Time Machine から除外しても良い。元のファイルがあればいくらでも再生成できるものだからだ。実際これらの lrdata を削除して Lightroom を起動しても何の警告もなく起動し、プレビューは必要に応じて再生成されスマートプレビューはなかったことにされる。

スマートプレビュー

もしドライブを常時接続している場合は恩恵がないので生成しないほうがよさそう。読み込みダイアログで生成するチェックボックスをはずすこと。

これは写真ストレージになっているドライブを頻繁にとりはずして(例えばノートPC単体にして)現像を行いたいときのためのものなので、それをやらないなら特にメリットはない。

.lrcat っていったい何なのか

Lightroom のカタログを SQLite で読んで統計を出したりする | tech - 氾濫原

  1. トップ
  2. tech
  3. Lightroom カタログを専用ドライブに

.lrcat っていったい何なのか

カタログファイルの実体である lrcat は SQLite の DB ファイルそのもの。sqlite3 foo.lrcat すると中身を見ることもできる。

部分的に見た結果をメモしておく

# 画像に対応するテーブル?
Adobe_images
# Exif 情報に対応するテーブル?
AgHarvestedExifMetadata
# ファイルに対応するテーブル?
AgLibraryFile
AgLibraryFolder

# 画像とファイルのリレーション?
select Adobe_images.captureTime, baseName, modTime from Adobe_images inner join AgLibraryFile on Adobe_images.rootFile = AgLibraryFile.id_local;

# 画像と exif のリレーション?
select * from Adobe_images join AgHarvestedExifMetadata on AgHarvestedExifMetadata.image = Adobe_images.id_local;

たとえば

sqlite> .schema AgHarvestedExifMetadata
CREATE TABLE AgHarvestedExifMetadata (
    id_local INTEGER PRIMARY KEY,
    image INTEGER,
    aperture,
    cameraModelRef INTEGER,
    cameraSNRef INTEGER,
    dateDay,
    dateMonth,
    dateYear,
    flashFired INTEGER,
    focalLength,
    gpsLatitude,
    gpsLongitude,
    gpsSequence NOT NULL DEFAULT 0,
    hasGPS INTEGER,
    isoSpeedRating,
    lensRef INTEGER,
    shutterSpeed
);

なので (index は省略)、dateYear ごとの focalLength 統計を求めたい場合は

select dateYear, focalLength, count(*) from AgHarvestedExifMetadata group by dateYear, focalLength;

とか、もっとシンプルにレンズ焦点距離の使用頻度なら

sqlite> select focalLength, count(*) as cnt from AgHarvestedExifMetadata group by focalLength order by cnt;
...
24.2|1003
35.0|1037
|1093
200.0|1139
18.0|1153
22.0|1307
24.0|1378
70.0|1928
50.0|1978
30.0|4265
100.0|4522

みたいなことはできる。

レンズ名ごとの撮影枚数 (Lightroom 上でもわかるが) なら

 select AgInternedExifLens.value, count(*) as cnt from AgHarvestedExifMetadata join AgInternedExifLens on AgHarvestedExifMetadata.lensRef = AgInternedExifLens.id_local group by lensRef order by cnt;

とか。

今年の統計 (これも Lightroom 上でもわかるが) だけならこんな感じとか

select AgInternedExifLens.value, count(*) as cnt from AgHarvestedExifMetadata join AgInternedExifLens on AgHarvestedExifMetadata.lensRef = AgInternedExifLens.id_local where dateYear = CAST(strftime("%Y") AS NUMERIC) group by lensRef order by cnt;
24-70mm|10
20mm|17
EF50mm f/1.4 USM|75
EF-M22mm f/2 STM|77
EF70-200mm f/2.8L IS II USM|253
EF100mm f/2.8L Macro IS USM|353
35mm|428
E PZ 16-50mm F3.5-5.6 OSS|1260
30mm F1.4 DC DN | Contemporary 016|4083

もうちょっと Lightroom 上で見れない統計を出したいと思ったが思いつかなかったので思いついたら続きを書く

  1. トップ
  2. tech
  3. Lightroom のカタログを SQLite で読んで統計を出したりする