オブジェクトのコレクションを管理し、アプリケーションのローカル フォルダーに格納する Windows ストア アプリケーションがあります。これらのオブジェクトは、JSON を使用してファイル システム上でシリアル化されます。これらのアイテムを個別に編集して保持できるようにする必要があるため、1 つの大きなファイルではなく、オブジェクトごとに個別のファイルを選択しました。オブジェクトは、次のパターンに従って格納されます。
Local Folder
|
--- db
|
--- AB283376-7057-46B4-8B91-C32E663EC964
| |
| --- AB283376-7057-46B4-8B91-C32E663EC964.json
| --- AB283376-7057-46B4-8B91-C32E663EC964.jpg
|
--- B506EFC5-E853-45E6-BA32-64193BB49ACD
| |
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.json
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.jpg
|
...
各オブジェクトには、JSON シリアル化されたオブジェクトとその他の最終的なリソースを含むフォルダー ノードがあります。
書き込み、読み取り、削除のテストを行ったところ、すべて問題ありませんでした。複雑になったのは、アプリケーションの起動時にオブジェクトの大規模なコレクションをロードしようとしたときです。保存できるアイテムの最大量は 10000 になると見積もっています。そのため、10000 エントリを書き込んでからロードしようとしました...アプリケーションが操作を完了するまでに 3 分以上かかりましたが、これはもちろん受け入れられません。
だから私の質問は、オブジェクトの読み取りと逆シリアル化のために作成したコードで最適化できるものは何ですか (以下のコード)? WinRT アプリケーションで読み込みが動的になるようにページング システムを実装する方法はありますか? 私のストレージ方法 (上記のパターン) は IO/CPU に関して重すぎますか? WinRT で何か不足していますか?
public async Task<IEnumerable<Release>> GetReleases()
{
List<Release> items = new List<Release>();
var dbFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(dbName, CreationCollisionOption.OpenIfExists);
foreach (var releaseFolder in await dbFolder.GetFoldersAsync())
{
var releaseFile = await releaseFolder.GetFileAsync(releaseFolder.DisplayName + ".json");
var stream = await releaseFile.OpenAsync(FileAccessMode.Read);
using (var inStream = stream.GetInputStreamAt(0))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Release));
Release release = (Release)serializer.ReadObject(inStream.AsStreamForRead());
items.Add(release);
}
stream.Dispose();
}
return items;
}
ご協力いただきありがとうございます。
NB: 私はすでに SQLite を見ていたので、そのような洗練されたシステムは必要ありません。