我有一个应用程序,在嵌套类对象中维护用户数据,在应用程序开始时,数据从磁盘读取、解压缩(gzip)、反序列化(JSON)到我的主类对象(称为包含所有嵌套类的StoredData对象)。
现在,我的应用程序的设计方式是,每当用户在应用程序中进行更改时,它就会在StoredData中的相关类对象中更改底层属性值,并立即将其保存到磁盘中。保存过程与装载相反.序列化到JSON字符串,gzip压缩并写入磁盘。
这个模型对我来说很好,直到用户数据攀升到相当大的数量为止。原始的JSON序列化数据字符串(没有压缩)是98 MB,而且还在增加。每次用户进行更改时,由于数据大小较大,保存过程会将应用程序挂起大约3-5秒。
我的解决方案之一是将保存过程推入后台线程。除了用户在一秒钟内调用两次或更多保存进程的快速更改的情况外,这在一段时间内起了作用。我的应用程序抛出一个异常,当StoredData对象被转换为JSON时,该对象被主线程修改(由于用户活动)。
我需要社会人士就如何最好地处理这种情况提供指导。我没有考虑迁移到SQL数据库模型,这需要在我的应用程序中进行大量的重新编码。
谢谢
发布于 2018-05-11 13:17:10
您的问题不是写入磁盘而不是使用SQL数据库,而是将所有内容存储并写入到单个对象中。
因此,显而易见的答案是:将StoredData对象拆分为多个对象,并单独保存它们。较小的对象,更快的写入,没有挂起。
或者,不要做一个完整的写作。只将实际更改的内容序列化和写入磁盘。但是,这可能相当困难,并且不确定当内容是GZIPed时是否可能。如果您有许多写作,它可能仍然是有问题的。我个人不会选择这种方法。
第三,您尝试了作为解决方案的并发,但有一个种族条件。您是否将所有内容都推入后台线程,即JSON序列化、GZIP和写入磁盘?如果是这样的话,您可以尝试在主线程上序列化,并在后台线程上执行GZIP+disk写操作,当您更改对象时,这不会导致异常。
最后要注意的是:您有一个捕获所有数据并且在序列化时不能修改的上帝对象。这不是一个可持续的设计,迟早要重构您的应用程序。
https://stackoverflow.com/questions/50292818
复制相似问题