Я работаю над приложением загрузки, которое разбивает файлы перед загрузкой. Он разбивает файлы, чтобы предотвратить закрытие 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, но это было бы просто обходным путем вместо фактического решения.
Если есть какие-либо предложения относительно получения объема памяти, используемого приложением, или даже других методов управления динамическим размером чанка, я был бы признателен за это.