需要建议快速存储大型序列化对象

时间:2018-05-11 12:53:40

标签: c# json database serialization

我有一个应用程序,其中用户数据在嵌套类对象中维护,在应用程序开始时,数据从磁盘读取,解压缩(gzip),反序列化(JSON)到我的主类对象(称为{{1}包含所有嵌套类的对象。)

现在我的应用程序的设计方式是每次用户在应用程序中进行更改时,它会更改StoredData中相关类对象中的基础属性值,并立即将其保存到磁盘。保存过程与加载相反...序列化为JSON字符串,gzip压缩并写入磁盘。

此模型对我来说效果很好,直到用户数据攀升到显着数量。原始JSON序列化数据字符串(不压缩)为98 MB并且正在增加。每次用户进行更改时,由于数据量较大,保存过程会将应用程序挂起约3-5秒。

我的一个解决方案是将保存过程推送到后台线程。除了用户进行快速更改以在一秒钟内调用保存过程两次或更多次的情况之外,这种情况有效。我的应用程序抛出一个异常,当StoredData对象转换为JSON字符串时,主线程会修改该对象(由于用户活动)。

我需要社区提供有关如何最好地处理这种情况的指导。我没有考虑转移到SQL数据库模型,这需要在我的应用程序中进行大量重新编码。

由于

1 个答案:

答案 0 :(得分:2)

您的问题不是您正在写入磁盘而不是使用SQL数据库,您的问题是您将所有内容存储并写入单个对象。

所以明显的答案是:将你的StoredData对象分成几个并单独保存。较小的对象,更快的写入,没有挂起。

或者,不要做完整的写作。序列化并仅写入实际更改的磁盘。但这可能相当困难,并且在内容为GZIP时不确定是否可能。如果你有很多写,它可能仍然有问题。我个人不会选择这种方法。

第三,您尝试将并发作为解决方案,但遇到了竞争条件。你是否已将所有内容都推送到后台线程,这意味着JSON序列化,GZIP和写入磁盘?如果是这样,您可以尝试在主线程上进行序列化并在后台线程上执行GZIP +磁盘写入,这在您更改对象时不会导致异常。

作为最后一点:你有一个上帝对象可以捕获你的所有数据,并且在序列化时无法修改。这不是一个可持续的设计,迟早你 必须重构您的应用程序。