美文网首页iOS 深度好文
iOS将大文件映射到内存(读取大文件)

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

作者: love紫川 | 来源:发表于2017-02-10 11:30 被阅读740次

认真分析mmap:是什么 为什么 怎么用
http://www.cnblogs.com/huxiao-tee/p/4660352.html

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

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

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


使用NSDataReadingMappedIfSafe参数后内存占用:

由此可见,对于体积很大文件,使用内存映射方式读取将会减少大量内存占用。 什么是文件内存映射呢
文件内存映射是指把一个文件的内容映射到进程的内存虚拟地址空间中,这个实际上并没有为文件内容分配物理内存。实际上就相当于将内存地址值指向文件的磁盘地址。如果对这些内存进行读写,实际上就是对文件在磁盘上内容进行读写。

相关文章

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

    认真分析mmap:是什么 为什么 怎么用http://www.cnblogs.com/huxiao-tee/p/4...

  • iOS将大文件映射到内存

  • 如何用python读取一个500G的文本

    遇到超大文件,不能直接放在内存中,要分段进行读取 以减少内存的占用

  • java读取大文件解决思路

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作。...

  • Go 读取大文件

    不管是任何语言,读取大文件的时候,不可能直接将GB以上的文件直接读取加载到内存中,因为这对内存的消耗是个很大的问题...

  • Dom 和 Sax 区别

    1. Dom 将 xml 树形结构存放在内存中,不适合大文件的读取 2. Dom 速度更快, 因为在内存中 3. ...

  • node读写大文件

    如果读取小文件,我们可以使用fs读取,fs读取文件的时候,是将文件一次性读取到本地内存。而如果读取一个大文件,一次...

  • php怎样防止内存溢出oom

    php怎样防止内存溢出oom 在编程的时候经常会遇到下载大文件,如果将下载的大文件都读到内存中再存储到硬盘这个时候...

  • java操作文件

    优雅读取文件 优雅的写入文件 读取大文件

  • vite项目中无法使用minio的解决方案

    问题背景项目需要上传大文件,既然是大文件,如果一次性进行读取发送、接收都是不可取的,很容易导致内存问题。所以对于大...

网友评论

    本文标题:iOS将大文件映射到内存(读取大文件)

    本文链接:https://www.haomeiwen.com/subject/ntsgittx.html