您的位置:首页 > 移动开发 > IOS开发

iOS内存优化--大文件如何处理,内存映射

2017-04-20 11:15 218 查看
iOS开发经常使用到大文件,如大数据库,高清图片,视频资源,如果将这些数据缓存在内存中,会影响到内存性能。
笔者从内存映射入手,给大家展示下大文件的处理,


1、在cache目录下,放一个视频文件,该视频文件450M大小。

NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [cachePath stringByAppendingPathComponent:@"Video_test.wmv"];
NSLog(@" filePath = %@", filePath);

_data = [NSData dataWithContentsOfFile:filePath];


运行效果如下:系统的Memory同时高达450M,显然不是我们希望看到的。



2、NSData如果用磁盘映射的初始化方法,新增了一个option选项

NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [cachePath stringByAppendingPathComponent:@"Video_test.wmv"];
NSLog(@" filePath = %@", filePath);

_data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:nil];


运行效果如下:是不是极大提高内存性能



3、这个选项到底是做什么用呢?查阅官方文档:



NSDataReadingMappedIfSafe:提示指示文件应该映射到虚拟内存,如果可能和安全。

NSDataReadingUncached:提示显示文件不应该存储在文件系统缓存。数据读取一次,丢弃,这个选项可以提高性能。

NSDataReadingMappedAlways:在如果可能提示映射文件。

总之对于大文件的处理,使用NSDataReadingMappedIfSafe进行映射就能大幅度优化,文件内存映射是指把一个文件的内容映射到进程的内存虚拟地址空间中,这个实际上并没有为文件内容分配物理内存。实际上就相当于将内存地址值指向文件的磁盘地址。如果对这些内存进行读写,实际上就是对文件在磁盘上内容进行读写。

原创,转载请注明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息