Получить объем памяти, используемый приложением в iOS - PullRequest
3 голосов
/ 30 марта 2012

Я работаю над приложением загрузки, которое разбивает файлы перед загрузкой. Он разбивает файлы, чтобы предотвратить закрытие iOS из-за использования слишком большого объема памяти, так как некоторые файлы могут быть довольно большими. Было бы замечательно, если бы я мог вместо установки максимального размера «чанка» установить максимальное использование памяти и определить размер, используя это.

Примерно так

#define MAX_MEM_USAGE 20000000 //20MB
#define MIN_CHUNK_SIZE 5000   //5KB

-(void)uploadAsset:(ALAsset*)asset
{
    long totalBytesRead = 0;
    ALAssetRepresentation *representation = [asset defaultRepresentation];
    while(totalBytesRead < [representation size])
    {
        long chunkSize = MAX_MEM_USAGE - [self getCurrentMemUsage];
        chunkSize = min([representation size] - totalBytesRead,max(chunkSize,MIN_CHUNK_SIZE));//if I can't get 5KB without getting killed then I'm going to get killed
        uint8_t *buffer = malloc(chunkSize);
        //read file chunk in here, adding the result to totalBytesRead
        //upload chunk here
    }
}

По сути, это то, для чего я иду. Я не могу найти способ получить текущее использование памяти моего приложения специально. Меня не особо волнует объем оставшейся системной памяти.

Единственный способ, которым я смог придумать, - это тот, который мне не очень нравится. Получите объем системной памяти в первой строке main в моем приложении, затем сохраните ее в статической переменной в классе globals, тогда getCurrentMemUsage будет выглядеть примерно так:

-(long)getCurrentMemUsage
{
    long sysUsage = [self getSystemMemoryUsed];
    return sysUsage - [Globals origSysUsage];
}

Это имеет ряд серьезных недостатков. Самым очевидным для меня является то, что другое приложение может быть убито в середине моей загрузки, что может привести к падению sysUsage ниже, чем origSysUsage, что приведет к отрицательному числу, даже если мое приложение использует 10 МБ памяти, что может привести к тому, что мое приложение использует 40 МБ для запрос, а не максимум, который составляет 20 МБ. Я всегда мог настроить его так, чтобы оно фиксировало значение между MIN_CHUNK_SIZE и MAX_MEM_USAGE, но это было бы просто обходным путем вместо фактического решения.

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

1 Ответ

0 голосов
/ 30 марта 2012

Теперь, как и в любой операционной системе с виртуальной памятью, получение «используемой памяти» не очень хорошо определено и общеизвестно сложно определить и рассчитать.

К счастью, благодаря диспетчеру виртуальной памяти, ваша проблема может быть решена довольно легко: функция mmap () C. По сути, это позволяет вашему приложению виртуально загружать файл в память, обрабатывая его так, как если бы он находился в оперативной памяти, но он фактически выгружается из хранилища при обращении к нему и выгружается при нехватке памяти в iOS.

Эту функцию действительно легко использовать в iOS с API-интерфейсами Cocoa для нее:

- (void) uploadMyFile:(NSString*)fileName {
    NSData* fileData = [NSData dataWithContentsOfMappedFile:fileName];
    // Work with the data as with any NSData* object. The iOS kernel
    // will take care of loading the file as needed.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...