SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cyber Luxeonで学ぶXMLDB入門

XMLDBのチューニングポイント

Cyber Luxeonで学ぶXMLDB入門 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

XMLDBへは正規化して格納する

 XMLDBにデータを格納するときは、XMLを正規化(normalize)し、データサイズをなるべく小さくし保存することが推奨されます。XMLの正規化とは、論理的にXMLが同一であるということを保証したうえで、人が読みやすいようにXMLに付加された改行、インデント(半角スペース、タブ、改行)を取り除いたり、要素値が空値の場合で開始タグと終了タグがある場合に、終了タグ(<タグ名/>)のかたちに変換する処理のことをいいます。

 正規化により、データベース全体の物理データサイズが減少し、フラグメンテーションによる性能の劣化などをあらかじめ防止することができます。またデータの転送量が減少するので、ネットワークへの負荷も軽減できます。

アプリケーション開発時の注意点

XMLの解析方式による違い

 XMLアプリケーションを開発する際に最も注意するべき点は、XMLを解析する際のXMLの処理方式でしょう。以下の表にXML操作方式別の特徴と、デメリットをまとめました。

処理方式1
処理方式名特徴デメリット
DOMXMLすべてをメモリ上にツリー形式で保存するのでXMLへのランダムアクセスが可能。メモリを多く消費する。
SAXXML要素をシリアルに解析し、XMLエンティティ出現イベントの発生ごとにパーサからイベントを受け取る。メモリの使用量が少ない。プログラミングが複雑になることがある。
StAXDOMとSAXの中間方式。カーソルでXMLのランダム操作が可能。メモリの使用量もDOMに比べて少ない。あまり普及していない。

 アプリケーションの要件にもよるとは思いますが、上記3つの中では、StAXを採用するのが今後は最もバランスが良いでしょう。DOMを使用する際は、XMLをパースする負荷、メモリ消費量が大きいので、注意が必要です。使用する場合は、DOMの解析実行頻度、処理同時並行性などを考慮する必要があるでしょう。

DOMツリーとJAXBオブジェクトツリーのメモリー使用量比較

 第4~6回の「XMLDBとJavaAPI、JAXB2.0を活用したWebアプリケーション開発」(設計編APIチュートリアル編実装編)で、JAXBを用いたXMLアプリケーションを開発する手法を説明しました。JAXBもDOMと同様、XMLのデータ構造をツリー構造に保持して操作しますので、メモリーの使用量が気になるところです。ここでは同じXMLデータをDOM形式で保持した場合とJAXBのオブジェクトで保持した場合のメモリーサイズを比較してみました。

使用したXML

 以下に検証に使用したXMLを示します。第4~6回で使用した商品のXMLと同一です。実際のXMLは、インデントされておらず正規化されたものを使用しました。

検証に使用したXML
<?xml version="1.0" encoding="UTF-8"?>
<item item_code="Cen001">
    <item_name>次世代型扇風機ハリケーン</item_name>
    <price>5000</price>
    <description>
        <caption>夏をより快適に、健康に過ごすために、
開発された次世代型扇風機です。人類の健康を害してきたエアコンの時代は
終焉を迎えます。</caption>
        <header>夏には大ブレーク必至。品切れ必至!!</header>
        <footer>今年の大ヒット商品として年末にはクローズアップされます。
        </footer>
    </description>
    <option_name>サイズ</option_name>
    <options>
        <option>特大</option>
        <option></option>
        <option></option>
    </options>
    <reg_date>2007-06-16T17:51:43.500+09:00</reg_date>
</item>

検証方法

 以下のJavaプログラムを使用して、XMLを格納したオブジェクトの生成前後のヒープメモリサイズを測定し、前後のメモリサイズの差分によってオブジェクトのサイズを計測しました。

検証に使用したコード(JAXB用)
public static void main(String[] args) throws Exception{

    // XMLストア
    Session  clientSession = XlnClientSessionFactory.getSession();
    XMLStore xmlStore = clientSession.getXMLStore( "ec_item_xmlstore" );

    // バインダドキュメントの取得
    XMLDocument xmlDoc =
        (XMLDocument)xmlStore.getFile( "/items/item_container.bnd" );
    // XQuery実行
    String xquery =
        "for $item in /MultiDoc_Container/item\n"
        + "where $item/@item_code='Cen001'\n"
        + "return $item";

    XQuery xQuery = clientSession.createXQuery( xquery );
    xQuery.execute(xmlDoc);

    // XQuery結果の取得
    XQuerySequence results = xQuery.getResults();
    XQuerySequenceIterator iter = results.getIterator();

    JAXBContext jc = JAXBContext.newInstance( Item.class );
    Unmarshaller u = jc.createUnmarshaller();
    XQueryItem xQueryItem = iter.nextItem();
    Node node = (Node)xQueryItem.getValue();

    Runtime rt = Runtime.getRuntime();
    // オブジェクト取得前
    long befMem = rt.totalMemory() - rt.freeMemory();
    Object obj = u.unmarshal( node );
    // オブジェクト取得後
    long aftMem = rt.totalMemory() - rt.freeMemory();
    // メモリサイズ
    System.out.println( "JAXB Memory:" + ( aftMem - befMem ) );
}
検証に使用したコード(DOM用)
Session  clientSession = XlnClientSessionFactory.getSession();
XMLStore xmlStore = clientSession.getXMLStore( "ec_item_xmlstore" );

XMLDocument xml =
    (XMLDocument)xmlStore.getFile( "/items/Cen001.xml" );

Runtime rt = Runtime.getRuntime();
// オブジェクト取得前
long befMem = rt.totalMemory() - rt.freeMemory();
Document doc = xml.getDOMDocumentNode();
// オブジェクト取得後
long aftMem = rt.totalMemory() - rt.freeMemory();

// メモリサイズ
System.out.println( "DOM Memory:" + ( aftMem - befMem ) );
clientSession.release();

測定結果

 測定結果を以下の表に示します。

測定結果1
検証ケースメモリ使用量
DOM784008 byte
JAXB173520 byte

 JAXBのオブジェクトの方が、使用メモリが少ないという結果になりました。

考察・結論

 同一のXMLをDOMオブジェクトとJAXBのオブジェクトに格納した場合は、DOMオブジェクトに格納した場合の方がメモリを多く使用しました。これは、DOMオブジェクトの方がXMLの階層構造など、XMLに関する情報をオブジェクト内に格納しているためと考えられます。このようにDOMとJAXBは、同じようにXMLデータをオブジェクトのツリー構造で格納するにしても、JAXBの方が、メモリ消費量が少なく、かつデータ操作のプログラミングもしやすいというメリットがあるので、DOMとJAXBであれば、JAXBの採用をお勧めします。

XMLデータの構造について

 XMLDBの検索時に十分な性能を引き出すために最も重要なことを1つ挙げるとしたら、インデックスを適切に使用することでしょう。いくらXMLDBがスキーマレスという特徴を持つといっても、ただ単にwell-formed(整形式)でさえあればどのような構造のXMLでも格納してよいというわけではありません。十分な性能を得るためには、XMLのデータ構造も適切に設計する必要があります。

 ただしXMLのデータ構造で、どのようなものが良いとは一概には言えません。それは、インデックスの種類や性質、検索処理別の性能の良し悪しについては各XMLDB製品ごとに異なるからです。開発の中で使用する製品のインデックスの特徴を把握し、検証を繰り返すことによって、性能を引き出していくという作業が必要になるでしょう。

まとめ

 本稿では、XMLDB使用時のパフォーマンスに関する注意点として、XQuery、XPathを記述する際の注意点、そしてアプリケーションを開発する際の注意点について、実際に測定し検証しました。今後、XMLDBが世の中に普及していくにつれ、パフォーマンスチューニングに関する情報も蓄積されていくと思われます。

 本稿までで7回にわたって、XMLDBについて、Cyber Luxeonを使用して説明してきました。一般的に、何か新しいシステムを開発するといった話がある場合に、RDBをバックエンドDBとして採用されることが暗黙的に前提となっています。

 しかし今後システムへの要求は一層複雑化していきます。複雑なデータ構造を持つシステムをRDBで開発するという前提で見積ると、多くの時間がかかってしまうというような場合にも、XMLDBでの開発を検討すると、RDBよりも少ない時間で開発ができるという場面が考えられます。

 本連載が、XMLDBの採用をこれから検討する方々、そしてXMLDBをシステムのバックエンドソリューションの1つとして考えている方々の一助となれば幸いです。

参考資料

  1. Cyber Luxeon ハンドブック』 サイバーテック社
  2. XMLデータベース入門』 山田祥寛 著、翔泳社、2006年4月

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Cyber Luxeonで学ぶXMLDB入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1652 2007/09/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング