Эффективное использование NSData - PullRequest
2 голосов
/ 25 сентября 2011

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

 NSData *data1 = [NSData dataWithContentsOfFile: someFile];

Я проверил с помощью Инструментов, что все высвобождается и как используется ОЗУ, и я понял, что иногда он просто падает, когда аудио-файл слишком большой. Есть ли способ хранить данные в меньших разрядах или во флэш-памяти или любым другим способом, который позволил бы мне работать с большими файлами без превышения максимального объема оперативной памяти на iPhone.

Одна вещь, которую я использую, например, NSData, - это конкатенация двух файлов, таких как:

 [data1 appendData: data2];

Спасибо

Ответы [ 2 ]

4 голосов
/ 25 сентября 2011

Попробуйте это (из этого SO вопроса):

NSData* myBlob;
NSUInteger length = [myBlob length];
NSUInteger chunkSize = 100 * 1024;
NSUInteger offset = 0;
do {
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
    NSData* chunk = [NSData dataWithBytesNoCopy:(void*)[myBlob bytes] + offset
                                         length:thisChunkSize
                                   freeWhenDone:NO];
    offset += thisChunkSize;
    // do something with chunk
} while (offset < length);

Затем вы можете хранить где-нибудь каждый меньший блок и делать с ним что угодно позже после объединения.

Это все не проверено с моей стороны, но кажется разумным.

1 голос
/ 25 сентября 2011

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

конечно. проблема более фундаментальная, чем NSData - обычно вы не загружаете набор аудиофайлов (полностью) в память, особенно если у устройства очень мало памяти. нетипично загружать весь файл даже в osx, где у вас может быть достаточно памяти (если известно, что файл очень маленький). Вот почему аудио-файл apis позволяет читать и писать в блоках (ref: ExtAudioFileRead или AudioFileReadPackets).

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