内存映射文件

简介: 1.简介 内存映射文件,机器学习读大文件时可用,效率比传统IO要高。 用于内存映射文件的这部分内存,在Java的堆空间以外。 常见nio相关类见《 java NIO》,http://blog.csdn.net/chuchus/article/details/51886586  。 1.1 传统读写 在传统的文件IO中,底层是类似C语言的read()、write()操作 ,操作系统

1.简介

内存映射文件,机器学习读大文件时可用,效率比传统IO要高。

用于内存映射文件的这部分内存,在Java的堆空间以外。

常见nio相关类见《 java NIO》,http://blog.csdn.net/chuchus/article/details/51886586  。

1.1 传统读写

在传统的文件IO中,底层是类似C语言的read()、write()操作 ,操作系统  由当前的【用户态】切换到【内核态】,然后读数据至【OS缓冲区】,再拷贝到【进程的私有地址空间】中去,这样便完成了一次IO操作。

:为什么要多此一举搞一个内核IO缓冲区把原本只需一次拷贝数据的事情搞成需要2次数据拷贝呢?
:根据程序访问的局部性原理,这么做是为了减少磁盘的IO操作。当继续访问的文件数据在OS缓冲区时,便直接拷贝数据到进程私有空间,避免了再次的低效率磁盘IO操作。

:既然如此,JAVA的IO包中为啥还要提供一个 BufferedInputStream 类来作为缓冲区呢?
:当读取OS内核缓冲区数据的时候,便发起了一次系统调用操作(通过native的C函数调用),而系统调用的代价相对来说是比较高的,涉及到进程用户态和内核态的上下文切换等一系列操作。
BufferedInputStream 会根据情况自动为我们预读更多的字节数据到它自己维护的一个内部字节数组缓冲区中,这样我们便可以减少系统调用次数,从而达到其缓冲区的目的。

1.2 内存映射

内存映射文件和之前说的 标准IO操作最大的不同之处就在于它虽然最终也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲区,而是直接将进程的用户私有地址空间中的一部分区域与文件对象建立起映射关系,就好像直接从内存中读、写文件一样,速度当然快了。

2.相关类

java.nio.MappedByteBuffer

一个直接的字节缓冲,内容是一个文件的内存映射区域。 

MappedByteBuffer java.nio.channels.FileChannel.map(MapMode mode, long position, long size) 

将当前文件的一部分直接映射到内存。size为要映射部分的大小。

2.1 映射模式

java.nio.channels.FileChannel.MapMode

映射模式的枚举。

java.nio.channels.FileChannel.MapMode.READ_ONLY

只读。

java.nio.channels.FileChannel.MapMode.READ_WRITE

读写。

java.nio.channels.FileChannel.MapMode.PRIVATE

copy-on-write模式。

专用模式采用的是OS的“写时拷贝”原则,即在没有发生写操作的情况下,多个进程之间都是共享文件的同一块物理内存(进程各自的虚拟地址指向同一片物理地址)。一旦某个进程进行写操作,那么将会把受影响的文件数据单独拷贝一份到进程的私有缓冲区中,不会反映到物理文件中去。

3.例子

1G文件的读写,都在1秒以内。
实际使用中,用完FileChannel后必须将其关闭。


目录
相关文章
|
6月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
649 55
|
8月前
|
分布式计算 算法 Java
|
12月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
306 6
|
存储 缓存 Linux
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
359 0
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
333 0
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
213 0
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
467 3
|
消息中间件 Linux 容器
共享内存的创建和映射过程
【9月更文挑战第1天】消息队列、共享内存及信号量在使用前需生成key并获取唯一ID,均通过`xxxget`函数实现。
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
151 0

热门文章

最新文章

下一篇
oss云网关配置