我正在开发一个在上传前拆分文件的上传应用程序。它拆分文件以防止因使用过多内存而被 iOS 关闭,因为某些文件可能相当大。如果我可以设置最大内存使用量并使用它确定大小,而不是设置最大“ block ”大小,那就太好了。
像这样
#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 的第一行获取系统内存量,然后将其存储在全局类的静态变量中,然后 getCurrentMemUsage 会像这样
-(long)getCurrentMemUsage
{
long sysUsage = [self getSystemMemoryUsed];
return sysUsage - [Globals origSysUsage];
}
这有一些严重的缺点。对我来说最明显的是另一个应用程序可能会在我上传的过程中被杀死,这可能会使 sysUsage 低于 origSysUsage 导致负数,即使我的应用程序正在使用 10MB 的内存,这可能导致我的应用程序使用 40MB 的内存请求而不是最大值 20MB。我总是可以对其进行设置,使其将值限制在 MIN_CHUNK_SIZE 和 MAX_MEM_USAGE 之间,但这只是一种变通方法,而不是实际的解决方案。
如果有关于获取应用程序使用的内存量或管理动态 block 大小的不同方法的任何建议,我将不胜感激。
最佳答案
现在,与任何虚拟内存操作系统一样,“已用内存”的定义不是很明确,而且众所周知,很难定义和计算。
幸运的是,多亏了虚拟内存管理器,你的问题可以很容易地解决:mmap() C函数。基本上,它允许您的应用程序虚拟地将文件加载到内存中,将其视为在 RAM 中,但它实际上是在访问时从存储换入,并在 iOS 内存不足时换出。
此功能在 iOS 中使用 Cocoa API 非常容易:
- (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.
}
关于iphone - 获取应用程序在 iOS 中使用的内存量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9948944/