エクサバイトまで対応可能なバイナリシリアライズライブラリ ESON

by syoyo

コンピュータグラフィックスでは, 静的で, リードの比率が高く, 大量で1つのデータサイズが大きいバイナリデータを扱うのが多いので, そのためのシリアライズライブラリ ESON を作りました.

https://github.com/syoyo/eson/

 

実際には 1 年くらい前からありましたが, それなりに使うプロジェクトも増えてきたのでもう少し詳細を書いて普及してみようと思いました.

たとえば

https://github.com/lighttransport/obj2eson

など.

特徴は,

  • single header, single source でポータブル
  • C++ API は STL のみに依存
  • シリアライズ後のデータは linear になるので, リード時に mmap でより扱いやすい(予定). たとえば必要な部分領域だけをアクセスがあったときのみリードするなど.

バイナリデータのシリアライズについては, たとえば以下のような例がありますが, どれもしっくり来ませんでした.

  • redis : GB 単位のファイルを扱うのが難しい
  • bson(mongodb) : GB 単位のファイルを扱うのが難しい.  32bit のデータタイプしかサポートしていない.
  • Alembic : boost とか HDF5 とか依存関係が多すぎて扱いづらい.
  • protocol buffer 系 : 細かいデータの通信に特化した感があるので, 単一で大きなデータには向かない.

ESON のシリアライズの仕様については

https://github.com/syoyo/eson/blob/master/SPECIFICATION.md

にあります. 基本的には BSON の仕様を strip して 64bit 化した感じになります.

ESON の主な利用先としては以下が挙げられます.

  • テクスチャ, HDR 画像.
  • CAD やメッシュなどのジオメトリデータ.
  • シーングラフやシミュレーションキャッシュデータ.
  • NVM(Non volatile memory) 時代の KVS 的なストレージ.

NVM(persistent memory)は最近出始めて来た感があるので, ESON は CG 用に限らずより一般的な使い方にも使えるかもと考えています.

圧縮については, lossless は lz4, lossy(特に浮動小数点データ) はいいライブラリがまだありませんが wavelet か fpack あたりを取り入れてみたいと考えています.

Advertisements