我正在尝试在 iPhone/iPad 应用程序中使用 LZMA SDK,我的出发点是 Mo Dejong 提供的 iPhone 的 LZMA 示例项目,可在此处获得: https ://github.com/jk/lzmaSDK 原文在这里:http: //www.modejong.com/iOS/lzmaSDK.zip (我都试过了,我都得到了相同的结果)。
问题是提取使用的内存与 .7z 包含的未压缩内存一样多。换句话说,假设我有一个 40MB 的压缩文件,未压缩的文件是一个大约 250MB 的二进制 sqlite DB,它会慢慢地使用越来越多的内存,因为它将文件一直解压缩到 250MB。这将使 iPad1 或 iPhone4 之前的任何设备(256MB RAM)崩溃。我感觉很多人最终都会遇到同样的问题,所以现在的解决方案可以帮助很多开发人员。
我最初使用基于 Windows 的 7-zip(最新版本)和 16MB 字典大小在 PC 上创建了 .7z 文件。它应该只需要 18MB 的 RAM 来解压缩(在查看任务管理器的 PC 上进行测试时就是这种情况)。我还尝试使用 keka(开源 mac 存档器)创建存档,但它没有解决任何问题,尽管我可以确认 keka 本身在 mac 上提取文件期间仅使用 19MB 的内存,这是我所期望的。我猜下一步是比较 Keka 的源代码和 LZMA SDK 的源代码。
创建 .7z 文件时,我尝试了不同的字典大小和其他设置,但没有任何帮助。我还尝试在压缩之前将我的单个二进制文件分成 24 个较小的部分,但这也没有帮助(仍然使用超过 250MB 的 RAM 来提取 24 个部分)。
请注意,我对原始代码所做的唯一更改是使用更大的 .7z 文件。另请注意,提取完成后它会立即释放 RAM,但这无济于事。我觉得它并没有像提取应有的那样释放 RAM,或者它正在将整个内容放入 RAM 直到完成,然后才将其移出 RAM。此外,如果我尝试使用 mac 应用程序提取相同的确切文件,同时运行仪器,我看不到相同的行为(例如,在提取文件时,StuffIt Expander 的 RAM 最大约为 60MB,Keka,开源 mac存档器最大内存为 19MB)。
我不是一个 mac/xcode/objective-c 开发人员(还)所以任何帮助都将不胜感激。我可以改用 zip 或 rar,但我使用 LZMA 获得了更出色的压缩,所以如果可能的话,我想坚持使用这个解决方案,但显然我需要让它在不崩溃的情况下工作。
谢谢!