0

オブジェクトのコレクションを管理し、アプリケーションのローカル フォルダーに格納する 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 を見ていたので、そのような洗練されたシステムは必要ありません。

4

2 に答える 2

1

Filip が既に述べたように、おそらく起動時にすべてのデータをロードする必要はありません。最初のページにすべてのアイテムを本当に表示したい場合でも (一度に 10,000 個のアイテムをユーザーに表示するのは良い考えではないように思えます)、すべてのプロパティを使用できるようにする必要はありません。通常は、それらのいくつかはリストに表示されますが、ユーザーが個々のアイテムの詳細に移動するときに残りが必要になります。リストに必要なデータのみを含む別の「インデックス」ファイルを作成できます。これは重複を意味しますが、パフォーマンスの向上に役立ちます。

おっしゃっていましたが、SQLite はニーズに合わせて洗練されすぎているため必要ありません。詳しく調べてください。あなたのような構造化データを効率的に処理するように設計されています。それに切り替えると、パフォーマンスが大幅に向上し、最終的にはコードがさらにシンプルになると確信しています。やってみて。

于 2012-12-17T06:02:44.673 に答える
1

おそらく、JSON.NET は組み込みのものよりも優れています。ネットワーク経由でデータを送信しない場合、JSON や XML ではなくバイナリ シリアル化を行うのが最も簡単な方法です。最後に、アプリケーションの起動時にすべてのデータをロードする必要があるかどうかを考えてください。データをバイナリ レコードのリストとしてシリアル化し、実際に使用する必要があるレコードの範囲にすばやくジャンプできるインデックスを作成します。

于 2012-12-16T22:16:19.447 に答える