Я пытаюсь использовать LZMA SDK в приложении для iPhone/iPad, моей отправной точкой был пример проекта LZMA для iPhone, предоставленный Mo Dejong, доступный здесь: https://github.com/jk/lzmaSDK Оригинал был здесь: http://www.modejong.com/iOS/lzmaSDK.zip (я попробовал оба и получил одинаковый результат от обоих).
Проблема в том, что извлечение использует столько оперативной памяти, сколько .7z содержит в несжатом виде. Другими словами, скажем, у меня есть сжатый файл размером 40 МБ, несжатый файл представляет собой двоичную базу данных sqlite размером около 250 МБ, он будет постепенно использовать все больше и больше памяти, поскольку распаковывает файл до 250 МБ. Это приведет к сбою iPad1 или чего-либо еще до iPhone4 (256 МБ ОЗУ). У меня есть ощущение, что многие люди в конечном итоге столкнутся с этой же проблемой, поэтому решение сейчас может помочь многим разработчикам.
Первоначально я создал файл .7z на ПК, используя Windows 7-zip (последняя версия) и размер словаря 16 МБ. Для распаковки требуется всего 18 МБ ОЗУ (и это тот случай, когда тестируется на ПК с просмотром диспетчера задач). Я также пытался создать архив с помощью keka (архиватора Mac с открытым исходным кодом), это ничего не решило, хотя я могу подтвердить, что сама keka использует только 19 МБ оперативной памяти во время извлечения файла на Mac, чего я и ожидал. Думаю, следующим шагом будет сравнение исходного кода Keka с исходным кодом LZMA SDK.
Я экспериментировал с разными размерами словаря и другими настройками при создании файла .7z, но ничего не помогло. Я также попытался разбить свой единственный двоичный файл на 24 меньших части перед сжатием, но это также не помогло (по-прежнему используется более 250 МБ ОЗУ для извлечения 24 частей).
Обратите внимание, что ЕДИНСТВЕННОЕ изменение, которое я внес в исходный код, заключалось в использовании файла .7z большего размера. Также обратите внимание, что он сразу же освобождает оперативную память, как только извлечение завершено, но это не помогает. Я чувствую, что он не освобождает ОЗУ, как он извлекает, как должен, или помещает все содержимое в ОЗУ до самого конца, когда это делается, и только затем перемещает его из ОЗУ. Кроме того, если я попытаюсь извлечь тот же самый файл с помощью приложения для Mac во время работы с инструментами, я не увижу того же поведения (например, StuffIt Expander использует около 60 МБ ОЗУ при извлечении файла, Keka, Mac с открытым исходным кодом). архиватор исчерпал 19 МБ ОЗУ).
Я не очень разбираюсь в mac/xcode/objective-c (пока), поэтому любая помощь в этом будет очень признательна. Вместо этого я мог бы прибегнуть к использованию zip или rar, но с LZMA я получаю намного лучшее сжатие, поэтому, если это вообще возможно, я хочу придерживаться этого решения, но, очевидно, мне нужно, чтобы оно работало без сбоев.
Спасибо!