C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

C#でXMLを扱う時のメモ

XMLを扱っている上で困った、アレコレをまとめてみた。


・クラスをシリアライズしたXMLファイルを読み込む時、
XmlDocumentのLoadでOutOfMemoryExceptionが発生する対処方法


以下のように記述すると、XMLがある一定のサイズを超えると、
doc.LoadでOutOfMemoryExceptionが発生するようになる。


とりあえず、エラーを止めるには記述を以下のように変更すれば良い。


しかし、これだけでは根本的な解決にはならない。
一般的な対応方法は、SQLiteで、おとなしくDBを使うのが結果的に楽で早い。

ところで、肥大化したXMLファイルにjpg等の画像を埋め込んでいないだろうか?
この場合は対処方法がある。


・XML内に画像を埋め込んだ時にサイズが巨大になる対処方法
問題は、jpgやpngで取り込んだはずのデータでも、
すべからく32bitBMP形式で保存されるため、サイズが巨大化する。

これは以下のように、バイナリ化する際にImageクラスをそのまま、バイナリ化するのが原因。

これを解消するには、保存する際にjpgのバイナリにしてやることで回避可能。
もちろん画質はjpgになるが、この対応で読み込み時間が劇的に改善される。

さらにもう一歩踏み込むと、これはメモリ上にはビットマップで持ったままになる為、
プログラムの動作改善にはあまり効果がない。

そこで、使う寸前までJPGのバイナリでメモリ上に保持しておき、使う時に
Image = new Bitmap(new MemoryStream(PictureByteArray))
とした方がメモリ効率がぐっと良くなる。

また、読み込み時のメモリ確保、Bitmapの構築コストが無くなるので、
読み込み時間が更に短くなるはず。


・大きなファイルは直接上書きしない
あと、基礎的な所で、これだけ巨大なXMLを保存するときは直接上書きしてはならない。
以下の実装で書き出し中に万一メモリ不足でプログラムがハングアップすると、
過去データがすべて消える憂き目に合う。



気持ち面倒ではあるが、ワンクッション置くと、万一のとき、被害の度合いがぐっと減る。


以上、XMLアレコレでした。
基本的に、XMLでこのようなメモリをバカ食いする実装は、
本来は望ましくないのではないかと思う。

これらの手法は、ある程度データが増えた場合の一時的な対応なので、
なんらかのDBに移行するために、時間を稼ぐ延命措置ぐらいに思って欲しい。


もしくはXMLをランダムアクセスする、豪快なクラスを作るのも面白いかもしれない。
先頭アドレス、サイズ、キーを保存したファイルを用意すれば、不可能ではないのではないかと思う。
このエントリーをはてなブックマークに追加
LINEで送る

 | HOME | 

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2012-03 | »
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約