gpt4 book ai didi

objective-c - 使用 NSKeyedArchiver 编码大型对象图会占用内存

转载 作者:行者123 更新时间:2023-12-03 18:06:03 25 4
gpt4 key购买 nike

我正在使用 NSKeyedArchiver 来编码大对象图(76295 个对象。)这需要很多时间,但更糟糕的是 NSKeyedArchiver 不会归还其所有内存。

使用泄漏检查后,代码似乎根本没有泄漏,但由于某种原因,编码在完成后没有归还所有内存。

多次调用encode方法确实会让情况变得更糟,越来越多的内存被吃掉。

你有什么建议我可以喜欢吗?

附注数据库 (sqlite) 或 CoreData 不是替代方案,因为它们对于像上面提到的那样的大对象图来说似乎扩展性很差。

我更喜欢使用 NSKeyedArchiver 的解决方案

最佳答案

NSKeyedArchiver 实际上并不对对象进行编码。它只是遍历图表并调用图表中每个实例的编码方法。因此,最有可能的泄漏源是您为归档自定义类之一而编写的自定义编码器方法内部。您可能想要对各个类进行测试存档,以查看其中之一是否泄漏。

使用 NSKeyedArchiver 归档大型复杂图的问题是整个图会立即堆积到内存中。如果该类的大量实例被归档,则该类编码器中的一次泄漏可能会爆炸。如果您有 76,000 多个对象,而其中只有几千个对象每个泄漏几个字节,那么这些对象很快就会增加。

我必须补充一点,我从未遇到过,甚至读过这样的情况:无论大小如何,核心数据的性能都不比复杂图形的存档更好。 Core Data 就是专门为了处理此类问题而创建的。

如果您尝试过 Core Data 并且陷入困境,可能是因为您习惯了很多实体继承。由于 Core Data 在 SQL 的存储端使用单表继承,因此实体的所有后代最终都会出现在同一个表中,这会使事情陷入困境。请记住,实体与其建模的类是分开的,因此您可以拥有类继承而无需实体继承。这为您提供了继承的编码优势,而没有实体继承的速度损失。

关于objective-c - 使用 NSKeyedArchiver 编码大型对象图会占用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2266683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com