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 件のコメント:
コメントを投稿