iOS将大文件映射到内存(读取大文件)

Posted zzfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS将大文件映射到内存(读取大文件)相关的知识,希望对你有一定的参考价值。

http://blog.csdn.net/xyt243135803/article/details/40995759

在《中国区GPS偏移纠正(适用于Google地图)》一文中曾读取一个78M的大数据文件,一开始采用了NSData的dataWithContentsOfFile:方法。不少人反馈说如果直接使用,将会耗尽iOS的内存。其实这个是可以改善的。 NSData还有一个API:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

其中NSDataReadingOptions可以附加一个参数NSDataReadingMappedIfSafe参数。使用这个参数后,ios就不会把整个文件全部读取的内存了,而是将文件映射到进程的地址空间中,这么做并不会占用实际内存。这样就可以解决内存满的问题。

实际测试效果

不带参数时内存占用:

技术分享

使用NSDataReadingMappedIfSafe参数后内存占用:

技术分享

由此可见,对于体积很大文件,使用内存映射方式读取将会减少大量内存占用。 什么是文件内存映射呢

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

 

以上是关于iOS将大文件映射到内存(读取大文件)的主要内容,如果未能解决你的问题,请参考以下文章

将大文件从本地机器复制到 S3 时读取端点 URL 超时

使用多部分请求将大文件上传到服务器并使用休息套件读取进度

如何将大文件加载到分块的 Adonis JS 中?

存储映射IO

内存映射文件的性能特点

无法将大文件加载到 Spark 集群主节点上的 HDFS