【问题标题】:Optimal way to persist an object graph to flash on the iPhone将对象图持久保存到 iPhone 上的最佳方法
【发布时间】:2010-11-20 12:58:37
【问题描述】:

我在 iPhone 平台上的 Objective-C 中有一个对象图,我希望在关闭应用程序时保持闪烁。该图有大约 100k-200k 个对象并包含许多循环(按设计)。我需要能够尽快读/写这个图表。

到目前为止,我已经尝试过使用 NSCoder。这不仅与循环有关,而且还需要很长时间和大量内存来持久保存图形 - 可能是因为在幕后使用了 XML 文档。我也使用过 SQLite 数据库,但单步执行这么多行也需要大量时间。

我曾考虑使用 Core-Data,但担心我会遇到与 SQLite 或 NSCoder 相同的问题,因为我相信 core-data 的后备存储将以相同的方式工作。

那么有没有其他方法可以以轻量级的方式处理此对象图的持久性 - 理想情况下,我想要像 Java 的序列化这样的东西?我一直在考虑尝试 Tokyo Cabinet 或将一堆 C 结构占用的内存写入磁盘 - 但这将是大量的重写工作。

【问题讨论】:

    标签: iphone objective-c persistence object-persistence object-graph


    【解决方案1】:

    我建议重写为 c 结构。我知道这会很痛苦,但它不仅可以快速写入磁盘,而且性能应该更好。

    在任何人不高兴之前,我并不是说人们应该始终使用结构,但在某些情况下,这实际上对性能更好。特别是如果您一次将内存预先分配在 20k 个连续块中(使用指向该块的指针),而不是在重复循环中创建/分配大量小块。

    即如果你的循环不断地分配对象,那会减慢它的速度。如果您预先分配了 1000 个结构并且只有一个指针数组(或单个指针),那么这会快很多。

    (我曾经遇到过这样的情况,甚至我的桌面 Mac 也太慢,并且没有足够的内存来处理连续创建的数百万个对象)

    【讨论】:

    • 只要您不将转储文件从计算机传输到计算机,内存的原始转储就可以了。如果您尝试在不同机器之间共享文件,您将遇到“字节顺序”问题。这在有限的情况下肯定会更好。
    【解决方案2】:

    我强烈建议您再看看 Core Data,而不是自己动手。 Core Data 是为persisting object graphs 重新设计的。一个基于 NSCoder 的存档,就像您描述的那样,要求您将整个对象图保存在内存中,并且所有写入都是原子的。 Core Data 根据需要将对象进出内存,并且只能将图形中已更改的部分写入磁盘(通过 SQLite)。

    如果您阅读Core Data Programming Guide 或他们的tutorial guide,您会发现他们在性能优化方面投入了很多心思。如果您遵循 Apple 的建议(这似乎违反直觉,例如他们建议在某些时候对您的数据结构进行非规范化),您可以从数据模型中挤出比您预期更多的性能。我见过一些基准测试,Core Data 在你正在查看的大小的数据库中轻松击败手动调整的 SQLite。

    在 iPhone 上,当使用控制 fetches 的批量大小和 NSFetchedResultsController 中非常好的帮助类时,您还具有一些内存优势。

    构建图表的原理证明核心数据实现以将其与现有数据存储方法进行比较应该不需要那么长时间。

    【讨论】:

    • 如果用户想要达到的只是批量加载/卸载内存,这将永远无法达到相同的性能。
    • 但这并不是他们想要做的全部。他们试图管理一个复杂的对象图,包括序列化和反序列化,Core Data 非常适合这种情况。此外,如果使用 Core Data 正确完成,整个 100k-200k 元素图应该不需要一次加载到内存中,这对于像 iPhone 这样的内存受限设备来说是一个巨大的好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2011-07-09
    • 2013-09-22
    相关资源
    最近更新 更多