👙

けしからん画像分類器を作ってみる (5) データ管理 その1

2021/03/05に公開

目次

データ管理

前回まで、3回に渡ってデータ収集について述べました。
今回は集めたデータの管理について書いてみたいと思います。

2本目の記事で述べた通り、約48万枚の静止画、約1,700本の短い動画を収集しました。その他にもHTMLが約2万ページ分あります。
これほどのデータ量になると、ある程度工夫をしないとすぐにカオス状態に陥ってしまいます。

そこで、データ管理に関して工夫した点、上手くいった点などは以下の通りです。

  • 使用するハッシュアルゴリズムを1つに絞りました
  • URLはハッシュ値で管理しました
  • データはハッシュ値で管理しました
  • データはGitで管理しました
  • データはNFSを経由して読み書きしました
  • データはOverlayFSでマージして参照しました

使用するハッシュアルゴリズムを1つに絞りました

システム全体を通じて、使用するハッシュアルゴリズムを1種類に絞りました。また、そのハッシュ値の表現方法も1種類に絞りました。
今回使用したハッシュアルゴリズムはSHA-1(Wikipedia)、表現は16進数(小文字、40文字)に絞りました。
SHA-2(224〜512ビット)でも良かったのですが、160ビットもあれば十分かなと思ってSHA-1にしました。

ハッシュアルゴリズムとその表現を絞っておくことで、様々なデータをハッシュ値から検索することができて便利でした。
データの種類は問わず、ハッシュ値をgrepするだけでデータに行き着けました。

URLはハッシュ値で管理しました

ページをダウンロードしてストレージに保存する際、URLを直接ファイルパスにするのは不便だったので、URLもSHA-1でハッシュ化して管理しました。また、以前述べた通り、URLの正規化を頑張ることでなるべく同じハッシュ値になるようにしました。

macOSではshasumコマンドを使うことで簡単にハッシュ値を確認できます。(実際のプログラムではOpenSSL::Digest::SHA1を使用しました)

mac$ echo -n "https://www.google.com/" | shasum
595c3cce2409a55c13076f1bac5edee529fc2e58  -

例えばhttps://www.google.com/という文字列はSHA-1でハッシュ化して16進数で表現すると595c3cce2409a55c13076f1bac5edee529fc2e58という文字列になります。
16進数なのでファイルパスとして扱いづらい文字も含まれておらず、またどんなにURLが長くても40文字で表現できます。
実際には595c3cce2409a55c13076f1bac5edee529fc2e58.htmlと「ハッシュ値+拡張子」とすることで、ファイルを簡単に識別、確認できるようにしています。
今回のシステムではこれを「URL ID」と呼びました。

ページをキャッシュする場合などにこのURL IDを使用しました。
1つのディレクトリに大量のファイルが存在すると都合が悪い場合が多いので、8ビットずつ2階層に分けて保存しました。

例えば595c3cce2409a55c13076f1bac5edee529fc2e58.htmlというファイルは59/5c/595c3cce2409a55c13076f1bac5edee529fc2e58.htmlというパスに保存しました。
また、そのHTMLファイルのメタデータは59/5c/595c3cce2409a55c13076f1bac5edee529fc2e58.html.jsonというパスに保存しました。

データはハッシュ値で管理しました

URLと同様、データ(主にJPEG形式の画像、MP4形式の動画)もハッシュ値で管理しました。
今回のシステムではこれを「オブジェクトID」(Object ID)と呼びました。

どこから(どのURLから)取得したデータかは関係なく、データ自身のハッシュ値で管理しました。
ウェブ上には同じ画像、動画が複数のサイトにアップロードされており、その重複を排除するためにもハッシュ値で管理するのは都合が良かったです。

例えば0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33というハッシュ値を持つJPEG画像のデータは0b/ee/0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33.jpgというパスに保存しました。
また、その画像データのメタデータは0b/ee/0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33.jpg.jsonというパスに保存しました。

今回はここまで

データ管理に関する6つのトピックの内、3つを紹介した時点で力尽きました。
続きはまた次回。今日はここまで!

けしからん画像分類器を作ってみる (6) データ管理 その2」に続く。

Discussion