首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要对大型序列化对象的快速存储提出建议

需要对大型序列化对象的快速存储提出建议
EN

Stack Overflow用户
提问于 2018-05-11 12:53:40
回答 1查看 121关注 0票数 0

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

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

这个模型对我来说很好,直到用户数据攀升到相当大的数量为止。原始的JSON序列化数据字符串(没有压缩)是98 MB,而且还在增加。每次用户进行更改时,由于数据大小较大,保存过程会将应用程序挂起大约3-5秒。

我的解决方案之一是将保存过程推入后台线程。除了用户在一秒钟内调用两次或更多保存进程的快速更改的情况外,这在一段时间内起了作用。我的应用程序抛出一个异常,当StoredData对象被转换为JSON时,该对象被主线程修改(由于用户活动)。

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-11 13:17:10

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

因此,显而易见的答案是:将StoredData对象拆分为多个对象,并单独保存它们。较小的对象,更快的写入,没有挂起。

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

第三,您尝试了作为解决方案的并发,但有一个种族条件。您是否将所有内容都推入后台线程,即JSON序列化、GZIP和写入磁盘?如果是这样的话,您可以尝试在主线程上序列化,并在后台线程上执行GZIP+disk写操作,当您更改对象时,这不会导致异常。

最后要注意的是:您有一个捕获所有数据并且在序列化时不能修改的上帝对象。这不是一个可持续的设计,迟早要重构您的应用程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50292818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档