内存映射文件机制处理大文件

标签: 内存 映射 文件 | 发表时间:2013-11-03 03:03 | 作者:hongchangfirst
出处:http://blog.csdn.net

先说结论:使用内存映射文件来处理大文件可以提高效率。 

为什么呢?

我们先来看看如果不使用内存映射文件的处理流程是怎样的,首先我们得先读出磁盘文件的内容到内存中,然后修改,最后回写到磁盘上。第一步读磁盘文件是要经过一次系统调用的,它首先将文件内容从磁盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,实际上是两次数据拷贝。第三部回写也一样也要经过两次数据拷贝。

所以我们基本上会有四次数据的拷贝了,因为大文件数据量很大,几十GB甚至更大,所以拷贝的开销是非常大的。


而内存映射文件是操作系统的提供的一种机制,可以减少这种不必要的数据拷贝,从而提高效率。它由mmap()将文件直接映射到用户空间,mmap()并没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,所以只进行了一次数据拷贝 ,比read进行两次数据拷贝要好上一倍,因此,内存映射的效率要比read/write效率高。


一般来说,read write操作可以满足大多数文件操作的要求,但是对于某些特殊应用领域所需要的几十GB甚至更大的存储,这种通常的文件处理方法进行处理显然是行不通的。目前,对于上述大文件的操作一般是以内存映射文件的方式来加以处理的。

原文: http://blog.csdn.net/hongchangfirst/article/details/11599369

作者:hongchangfirst

hongchangfirst的主页: http://blog.csdn.net/hongchangfirst



作者:hongchangfirst 发表于2013-11-2 19:03:52 原文链接
阅读:57 评论:0 查看评论

相关 [内存 映射 文件] 推荐:

内存映射文件机制处理大文件

- - CSDN博客研发管理推荐文章
先说结论:使用内存映射文件来处理大文件可以提高效率. 我们先来看看如果不使用内存映射文件的处理流程是怎样的,首先我们得先读出磁盘文件的内容到内存中,然后修改,最后回写到磁盘上. 第一步读磁盘文件是要经过一次系统调用的,它首先将文件内容从磁盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,实际上是两次数据拷贝.

为何要在Java中使用内存映射文件(Memory Mapped File)或者MappedByteBuffer

- - 编程语言 - ITeye博客
尽管从JDK 1.4版本开始,Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念. 引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据.

分布式内存文件系统:Tachyon

- - 杨尚川的个人页面
Tachyon是一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存储在Tachyon里的文件. Tachyon是架构在最底层的分布式文件系统和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件,落地到分布式内存文件系统中,来达到共享内存,从而提高效率,减少内存冗余,减少GC时间等.

Nginx使用Linux内存加速静态文件访问

- - IT技术博客大学习
标签:   Nginx. Nginx是一个非常出色的静态资源web服务器. 如果你嫌它还不够快,可以把放在磁盘中的文件,映射到内存中,减少高并发下的磁盘IO. nginx.conf中所配置站点的路径是/home/wwwroot/res,站点所对应文件原始存储路径:/opt/web/res. shell脚本非常简单,思路就是拷贝资源文件到内存中,然后在把网站的静态文件链接指向到内存中即可.

MVC框架的映射和解耦

- - 博客 - 伯乐在线
最近在写一个业务上用到的框架,回想起接触过的一些MVC框架,尤其是主要贡献在后端表现层上的那些,它们之间有太多的相似,在不断解耦的过程中,层数和模块数也越来越多,需要不断引入层与层之间的映射逻辑将不同层次之间关联起来,我们不妨来查看一下这个过程,能否寻找一些MVC框架的共性和启示. MVC 1到MVC 2模型的进化.

JPA基本数据类型映射

- - 编程语言 - ITeye博客
                // initialValue = 0, allocationSize = 1)   Oracle中序列方式生成主键.                 //Oracle序列方式生成/主键.                 @GeneratedValue(strategy = GenerationType.IDENTITY)   //MySQL,SQLSErver自增长方式.

hibernate 大对象类型的hibernate映射

- - CSDN博客推荐文章
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应.

UrlRewrite.dll实现无后缀名的地址映射

- Bloger - 博客园-首页原创精华区
1 首先在iis里配置通配符应用程序映射,如下图:. (在通配符应用程序映射中添加.net的处理程序C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,具体操作请改为自己的文件位置). 2在UrlRewrite配置文件中配置.

DoubleCommand – 键位映射修改 [Mac] | 小众软件 > Mac

- Eleven - 小众软件
频繁交叉使用 PC 和 Mac 的褚师二狗很崩溃,刚熟悉了 Mac 的 Cmd 组合快捷键各种方便,PC 上没有 Cmd 键盘,往往是 Ctrl 组合快捷键. 时间长了,整个人都快精神分裂了. DoubleCommand 是 Mac 上的键位映射修改软件,可以调换 Cmd/Ctrl/Alt 等键位置.

位映射对大数据排重与排序

- - ITeye博客
利用位映射原理对大数据排重.     问题提出: M (如 10亿 )个int整数,只有其中N个数重复出现过,读取到内存中并将重复的整数删除.     问题分析: 我们肯定会先想到在计算机内存中开辟M个int整型数据数组,来one bye one读取M个int类型数组, 然后在一一比对数值,最后将重复数据的去掉.