分析機器の測定データには、高速度カメラの画像、質量分析(MS)の高分解能データ、長時間の時系列サンプリングなど、数十メガバイト〜数ギガバイトに達する大規模バイナリが存在します。
これらを XML 内部にすべて Base64 エンコードして埋め込むと、ファイルサイズが約 1.33 倍に膨らみ、テキストパーサーのメモリを枯渇させます。MaiML はこの現実的な運用課題を解決するため、外部リソース参照(<insertion>)機構を備えています。
MaiML のあらゆるグローバルオブジェクト(Material, Result, Condition 等)の content には、<insertion> 要素を持たせることができます。
<result id="result1" ref="rt1">
<uuid>cc19fb59-17d5-42a4-9800-a9e6d5eb357a</uuid>
<insertion>
<uri>file:///path/to/raw_dataset.csv</uri>
<hash method="SHA-256">I3lkEmVCmodT7CjSn/+zBFwKt9ttnOA9WV7lBL9v2zQ=</hash>
<uuid>280868d2-ff4e-47ef-8791-dc5d22a7db94</uuid>
<format>text/csv</format>
</insertion>
<name>External_Raw_Result</name>
</result>
uri (必須): 外部ファイルの保管先 URI(file://..., https://..., s3://... 等)。hash (必須): 外部ファイルの内容を保証する暗号学的ハッシュ(SHA-256等)の Base64 文字列とアルゴリズム名。format (任意): 外部ファイルの MIME タイプ(text/csv, application/x-hdf5, application/netcdf 等)。uuid (任意): 外部リソース実体の一意な識別子。外部参照方式を採用する場合の最大のリスクは、「リンク切れ(URIが無効になる)」や「参照先ファイルが誤って書き換えられる(サイレント・コラプション / 改ざん)」です。
MaiML では、<hash method="SHA-256"> を義務付けることで、「MaiML 自体は数 KB の軽量メタデータとしてアーカイブしつつ、参照先生データが 1 ビットでも改ざん・破損したら即座に検知できる」というハイブリッドな運用を実現しています。
pymaiml.query モジュールには、MaiML ファイル内に存在する外部依存リソースの URI 一覧を即座に収集するヘルパー関数 get_insertion_uris() が提供されています。
from pymaiml import query
xml_text = open("data.maiml", encoding="utf-8").read()
uris = query.get_insertion_uris(xml_text)
# 例: ['file:///home/tk/projects/study/topics/maiml/sensor_raw_data.csv']