0

我有一个 Windows Store 应用程序,它管理对象集合并将它们存储在应用程序本地文件夹中。这些对象使用 JSON 在文件系统上进行序列化。由于我需要能够单独编辑和保留这些项目,因此我为每个对象选择了单独的文件,而不是一个大文件。对象按照以下模式存储:

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 序列化对象和其他最终资源。

当我进行一些写作、阅读、删除测试时,一切都很好。当我试图在应用程序启动时加载大量对象时,它变得复杂了。我估计item one的最大数量会存储到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;
}

谢谢你的帮助。

注意:我已经看过 SQLite,我不需要这么复杂的系统。

4

2 回答 2

1

据说 JSON.NET 比内置的东西更好。如果您不通过网络发送数据,那么最快的方法是进行二进制序列化而不是 JSON 或 XML。最后 - 考虑一下您是否真的需要在应用程序启动时加载所有数据。将您的数据序列化为二进制记录列表并创建一个索引,以便您快速跳转到实际需要使用的记录范围。

于 2012-12-16T22:16:19.447 回答
1

正如 Filip 已经提到的,您可能不需要在启动时加载所有数据。即使您真的想在第一页显示所有项目(一次向用户显示 10,000 个项目对我来说听起来不是一个好主意),您也不需要让它们的所有属性都可用:通常只有一个其中几个显示在列表中,当用户导航到单个项目详细信息时,您需要其余的。您可以有一个单独的“索引”文件,其中仅包含列表所需的数据。这确实意味着重复,但它会帮助您提高性能。

尽管您已经提到,您不需要 SQLite,因为它对您的需求来说太复杂了,您真的应该仔细研究一下。它旨在有效地处理结构化数据,例如您的数据。我很确定如果你切换到它,性能会更好,你的代码最终可能会更简单。试试看。

于 2012-12-17T06:02:44.673 回答