Проблемы с памятью ZipArchive на iPhone для большого архива - PullRequest
2 голосов
/ 19 мая 2010

Я пытаюсь сжать несколько файлов в один zip-архив, и у меня появляется предупреждение о нехватке памяти. Поскольку полный zip-файл загружен в память, я думаю, что это проблема. Есть ли способ, с помощью которого я могу лучше управлять сжатием / распаковкой, используя ZipArchive, чтобы не все данные были в памяти одновременно?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Проведя некоторое исследование альтернатив ZipArchive, я нашел другой проект под названием Objective-zip, который, кажется, немного лучше, чем ZipArchive. Вот ссылка:

http://code.google.com/p/objective-zip/

API довольно прост. Одна вещь, с которой я столкнулся, заключалась в том, что в начале я читал данные и никогда не выпускал их, поэтому, если вы добавляете кучу больших файлов в zip-файл, не забудьте освободить данные. Вот небольшой код, который я использовал:

ZipFile *zipFile = [[ZipFile alloc] initWithFileName:archivePath mode:ZipFileModeCreate];

for(NSString *path in subpaths){
  NSData *data= [[NSData alloc] initWithContentsOfFile:longPath];
  ZipWriteStream *stream = [zipFile writeFileInZipWithName:path compressionLevel:ZipCompressionLevelNone];
  [stream writeData:data];
  [stream finishedWriting];
  [data release];
}

[zipFile close];
[zipFile release];

Надеюсь, это полезно для тех, кто сталкивается с той же проблемой.

0 голосов
/ 04 января 2011

Более простой способ справиться с этим - просто изменить метод чтения файла ZipArchive в NSData. Просто измените следующий код

data = [ NSData dataWithContentsOfFile:file ];

до

data = [ NSData dataWithContentsOfMappedFile:file ];

Это приведет к тому, что ОС прочитает файл в отображенной памяти. По сути, он просто использует гораздо меньше памяти, так как читает из файла, как ему нужно, вместо того, чтобы загружать все это в память сразу.

...