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参数后内存占用:

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

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

时间: 2024-12-25 07:34:05

iOS将大文件映射到内存(读取大文件)的相关文章

67.文件映射为内存进行操作与多线程 以及 文件映射到内存根据索引进行内存来实现读取多线程操作

问题引出: //有限的额内存情况怎么干活//索引载入内存,多线程//索引映射为内存 一.载入内存,按行读取进行多线程 定义路径以及其他信息 1 char path[256] = "kaifangX.txt"; 2 char indexpath[256] = "indexkf.txt"; 3 #define N 20151574 创建索引 1 struct index 2 { 3 int *pindex;//地址 4 int length; 5 }allindex =

66.文件映射为内存进行操作

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 char path[256] = "kaifang.txt"; 6 7 void main() 8 { 9 //路径,读写, 10 HANDLE hfile = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, 11 OPEN_EXISTING, FILE

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

dom4j解析XML文件(2)—读取XML文件

Emp.xml: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <list> 3 <emp id="1"> 4 <name>张三</name> 5 <age>34</age> 6 <gender>男</gender> 7 <salary>3000</salary> 8 <

随机访问文件RandomAccessFile 与 内存映射文件MappedByteBuffer

一.RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系

Java多线程读取大文件

前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋友跟我聊起,他说有个需求,需要把上G的txt文件读取写入到数据库.用普通的io结果自然是OOM了,所以果断用NIO技术.为了提高速度,自然还得用上多线程技术. 接下来就介绍一下实现思路以及相关的知识点. 内容 一.对文件分区 为了充分利用多线程读取,就需要把文件划分成多个区域,供每个线程读取.那么就

3分钟学会,学会用Python正确读取大文件

文件读写属于一种常见的IO操作,由于操作系统将底层操作磁盘的接口向上封装为一种通用接口,因此Python中读写文件的基本方法和JAVA.PHP等高级编程语言一样,先请求操作系统打开一个文件描述符,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件中,最后当文件读写操作完成后关闭文件. 需要注意的是文件读写完成后必须及时关闭文件,一方面打开的文件会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限制的,比如Linux操作系统中我们可以使用ulimit -n命令查看

ANDROID内存优化——大汇总(转)

原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参

Unity3D占用内存太大的解决方法【先转,慢慢看】

Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一