WP7用のアプリのプログラムをしている方と話す機会があったので、分離ストレージに問題が起きていないか聞いてみたところ、特に問題は無いとの事でした。「開発用端末の問題があるかも」みたいな話をしていました。そこは全く考えていなかったので、WP7海外端末が急に欲しくなってしまいました。日本発売まで我慢しようと思っていたのですが...
僕のところで起きている問題というのは
下記のようなコードを実行するプログラムをしばらく使うと、データ読み出しでxmlの解析に失敗する例外が発生してしまいます。
分離ストレージに保存する
try
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = new IsolatedStorageFileStream("folder.xml", FileMode.OpenOrCreate, store))
{
var sirializer = new DataContractSerializer(typeof(FolderList));
sirializer.WriteObject(stream, this);
}
store.Dispose();
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
MessageBox.Show(e.Message);
}
分離ストレージから読み出す
try
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
if (store.FileExists("folder.xml"))
{
System.Diagnostics.Debug.WriteLine(store.AvailableFreeSpace);
using (var stream = new IsolatedStorageFileStream("folder.xml", FileMode.OpenOrCreate, store))
{
var sirializer = new DataContractSerializer(typeof(FolderList));
return (FolderList)sirializer.ReadObject(stream);
}
}
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
MessageBox.Show(e.Message);
}
分離ストレージはアプリ外からは読み出せなく実際に何がエラーの原因かわからないので、アプリ上でシリアライズオブジェクトとしてでは無く、xmlファイルとして読んでみるとファイルの内容が他のファイルと混ざった状態で読み出されている事が判りました。
分離ストレージの扱いに慣れてないというか、疑問がいろいろと出てきます
ファイルサイズの制限とか
頻繁にアクセスをしてもパフォーマンスに影響がないか?
とか
分離ストレージもハードウェア的にはフラッシュベースのストレージだと思うので、アクセス回数を減らすようにプログラムを作るべきなのか?
例えば、プログラムの起動時と終了時だけアクセスするようにプログラムするべきか、データの変更が有るたびにファイルに書き出してメモリの使用量を抑えるように作るべきなのか?
最近知ったのですが、ssd等のフラッシュメディアではライト回数だけでなく、リード回数もパフォーマンスに影響を与えるそうです。同じ領域を繰り返しリードするだけで、その部分のデータ保護機構が働いてデータの再配置が起こります
だとすると、必要な時だけファイルからデータを読んで、いらなくなったら直ぐに捨てるような使い方より、一度読み込んだデータは捨てずにRAM上に残しておいた方が良いのかな?と