2011年2月10日木曜日

ちょっと昔に扱ったSedna XML Database

http://www.modis.ispras.ru/sedna/

Perl使って無茶なXMLを作る

use utf8;
binmode STDOUT, ":utf8";
@TDFK_NM=('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮城県','鹿児島県','沖縄県');

printf("<KKK>\n");
for($ii=0;$ii<1600;$ii++){
 printf("<JGY NAME=\"アラバマ_$ii\" TDFK=\"$TDFK_NM[$ii%47]\">\n");
 for ($i=0;$i<300000;$i++){
  $qq = sprintf("%04d%02d",1980+$i%30,$i%12);
  printf("    <KJN ID=\"$i\" TDFK=\"$TDFK_NM[$i%47]\" IHI=\"$i\" DATE=\"$qq\" />\n");
 }
 printf("</JGY>\n");
}
printf ("</KKKK>\n");



上記をUTF-8でtest.plに保存
これを、以下のようにしてXMLファイルを作成
perl test.pl > log2.xml
(これやると32GのXMLが出来るよ)

次にXMLDBを起動
se_gov
DBを作成
se_cdb test2db
DBを起動
se_sm test2db
んで、クエリ用テキストを作成
LOAD "log2.xml" "test2db"
これをload_data.xQueryとして保存
次にバルクインサート
se_term -file load_data.xQuery test2db
この後、32GのXMLを読んでTMPファイルが作成され、
その後、XMLDBにインサートされていく
結果195GのDBが出来上がる

んじゃ、バルクインサートが終わったらクエリ発行してみる
let $jgy := document("test2db")/KKK/JGY[@NAME="アラバマ_1"]
return sum($jgy/KJN[@TDFK="岩手県" or @TDFK="北海道"]/@IHI)

これをtest.xQueryとして保存
実行してみる

se_term -file test.xQuery

結果は数秒で出る

1.914619148E9

次回からはキャッシュにはまるのかもっと早く出る。
1600の大項目のうち、アラバマ_1のデータから
30万件の項目のうち、岩手県と北海道のIHIの値をSUMしているわけだが、数秒・・・
これ普通のMSSQLServreでも同じくらいのスピードだが・・・

サイズが巨大すぎる。
まだまだな感じである。

0 件のコメント: