我正在开发一个在上传之前拆分文件的上传应用。它会拆分文件以防止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导致负数,即使我的应用程序使用10MB内存也可能导致我的应用程序使用40MB请求而不是20MB的最大值。我总是可以设置它,因此它会将MIN_CHUNK_SIZE和MAX_MEM_USAGE之间的值限制在一起,但这只是一种解决方法,而不是实际的解决方案。
如果有任何关于获取应用程序使用的内存量的建议,甚至是管理动态块大小的不同方法,我将不胜感激。
答案 0 :(得分:0)
现在,与任何虚拟内存操作系统一样,获取“使用的内存”的定义并不是很明确,而且很难定义和计算。
幸运的是,多亏了虚拟内存管理器,您的问题可以很容易地解决: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.
}