Как я могу использовать NSData для чтения нескольких больших файлов? - PullRequest
2 голосов
/ 21 июня 2011

Мне нужно прочитать несколько десятков файлов и выполнить простую обработку их содержимого. Каждый файл в отдельности не вызовет проблем, но загрузка всех данных за один раз быстро исчерпает мою память.

Я начал с:

for (NSString *filename in filenames)
    do_something([NSData dataWithContentsOfFile:filename]);

Тогда, конечно, я вспомнил, что Objective-C на iPhone на самом деле не является сборщиком мусора, и они все равно будут держаться до конца кадра. Хорошо:

for (NSString *filename in filenames) {
    NSData *d = [[NSData alloc] initWithContentsOfFile:filename];
    do_something(d);
    [d release];
}

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

Есть ли какой-нибудь способ, которым я могу создать NSMutableData и продолжать использовать этот буфер данных, увеличивая его по мере необходимости? Мне нужно это как NSData для других сторонних API. Лучшая идея, которая у меня есть на данный момент, - это неправильное / повторное использование буфера char * во время чтения, например, с помощью stdio и создание NSDatas с помощью freeWhenDone: NO при поддержке; таким образом я только беру / сохраняю небольшое количество за файл.

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

То, что вы делаете, это второй пример. Даже если вы повторно использовали объект NSMutableData для его емкости, другой объект NSData должен был бы быть создан с содержимым файла. Если у вас возникают проблемы с памятью, попробуйте изменить do_something() для работы с NSInputStream s .

1 голос
/ 21 июня 2011

Вы можете использовать -[NSData initWithContentsOfMappedFile:] со своим вторым примером, чтобы сохранить максимально возможное использование памяти.

Из документации:

В отображенном файле используются методы виртуальной памяти дляизбегайте копирования страниц файла в память до тех пор, пока они действительно не понадобятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...