`
newslxw
  • 浏览: 212763 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

NIO的内存映射文件一些问题

 
阅读更多

http://yipsilon.iteye.com/blog/298153

 

我觉得mappedbytebuffer更适用于文件较小,但是有些字节需要反复读取得情况


大约是这样的,对于计算一个大文件的MD5来说,每个字节都只读取一次,映射到内存应该是不会快的。

对于特别小的文件,javadoc是这么说的:

引用

For most operating systems, mapping a file into memory is more expensive than reading or writing a few tens of kilobytes of data via the usual read and write methods. From the standpoint of performance it is generally only worth mapping relatively large files into memory.

也就是说,它建议把“大”文件做映射(实际上它说的也就是要读写几十K),但是我想也许这个映射的开销是一次性的,对于小文件以后反复读写就快了吧。

这个映射的特点是可以将超过(物理内存+虚拟内存)、超过JVM最大内存大小的文件部分装入内存。因此,所谓装入内存实际上是虚拟的,我们看到的就是一个大数组,读的时候,如果在内存里面,就从内存里面读,否则就要读文件。

由于映射是操作系统负责的,所以其很多行为都是不确定的,在javadoc里面就有很多这方面的描述。主要是写操作后,数据对其它程序的可见性。

另外还有一个问题,就是map的文件部分的大小也是有限制的。如下:

WinXP 32位 2G内存,2G虚拟内存,Map一个2G的文件,XmX=64M
map 0~500M OK
map 0~1G 内存溢出错误
循环,每次map1M,返回的buffer不释放,到达将近2G时内存溢出,也就是说,map的文件部分的总和也是有限制的

Linux 32位 2G内存,1G虚拟内存,Map一个3G多的文件,XmX=64M
map 0~3G IllegalArgumentException,map的长度不能超过Integer.MAX_VALUE,也就是不能超过2G
map 0~Integer.MAX_VALUE ok
循环,每次map1M,返回的buffer不释放,到达2G后(2G或者2G多一点?)时内存溢出

Linux 64位 2G内存,2G虚拟内存,Map一个5G的文件,XmX=64M
map 0~5G IllegalArgumentException,map的长度不能超过Integer.MAX_VALUE,也就是不能超过2G
map 0~Integer.MAX_VALUE ok
循环,每次map1M,返回的buffer不释放,没有发现限制


有意思的是,第三个参数的类型是long,但是却不允许超过Interger.MAX_VALUE,不知是在其它操作系统下可以,还是给将来留一点余地?
反正现在在Linux64下,是基本够用了。

分享到:
评论

相关推荐

    Java NIO 应用使用内存映射文件实现进程间通信

    在Java NIO中,内存映射文件(MappedByteBuffer)是一个重要的特性,它允许将文件直接映射到内存中,以便于快速访问和修改文件内容。这一特性不仅提高了读写效率,而且还能用于进程间通信(IPC)。 内存映射文件的...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    java nio 写文件

    Java NIO还提供了一种叫做内存映射文件的高级特性。通过`FileChannel.map()`方法,可以直接将文件映射到内存中,这样读写文件就像操作内存一样快速。但需要注意的是,内存映射文件可能会消耗大量内存,因此对于大...

    java NIO 写文件

    4. **内存映射文件**:`MappedByteBuffer`允许将文件直接映射到内存,提供了极高的读写速度。 然而,尽管Java NIO提供了很多优势,但在实际使用中,开发者还需要注意一些潜在的问题,如内存管理(缓冲区过大可能...

    java 深入理解内存映射文件原理

    在Java中,使用内存映射文件通常通过java.nio包中的MappedByteBuffer类实现。通过FileChannel的map()方法,可以将文件映射到内存,从而提高大文件处理的性能。例如,以下代码展示了如何使用内存映射文件读取10MB的...

    【IT十八掌徐培成】Java基础第27天-01.MappedMemoryBuffer-文件内存映射缓冲区.zip

    1. **内存映射文件**:内存映射文件是一种技术,它将文件的内容直接映射到进程的虚拟地址空间中,使得文件就像一个巨大的字节数组一样可以被直接访问。这种方式减少了I/O操作的开销,因为操作系统负责文件和内存之间...

    NIO复制文件

    2. **ByteBuffer**:`java.nio.ByteBuffer`是NIO中最重要的缓冲区类型,它可以被映射到文件,也可以作为网络I/O的数据容器。在复制文件时,我们用它来存储从源文件读取或写入目标文件的数据。 下面是一个简单的文件...

    Large-File-Processing-master_javanio_java大文件处理_

    3. **内存映射文件(Memory-Mapped Files)**:Java NIO提供了一个特殊的功能,即内存映射文件,它可以将文件直接映射到内存中,使得文件操作如同访问内存一样快速。对于大文件处理,内存映射文件是一种高效的策略,...

    Java中用内存映射处理大文件的实现代码

    为了解决这个问题,Java提供了一种名为“内存映射文件”(Memory-Mapped File)的技术,它可以将文件直接映射到内存中,使得数据读写如同操作内存一样快速。本文将详细介绍如何在Java中使用内存映射文件,并通过示例...

    NIO与零拷贝_javanio_nio和零拷贝_

    - **mmap(Memory Mapped File)**:Java的FileChannel提供了一个映射文件到内存的功能。通过映射,文件数据可以直接被网络发送,跳过了从磁盘到用户空间再到内核空间的拷贝步骤。 - **Sendfile系统调用**:在...

    JAVA_IO/NIO(demo,压缩jar文件)

    4. **内存映射文件**:NIO支持内存映射文件,直接将文件映射到内存,提高了大文件读写的性能。 **总结** 这个压缩包的示例代码可能包括了如何使用Java的IO和NIO API进行文件读写,以及如何利用`java.util.jar`包将...

    java NIO实例

    4. **FileChannel**:用于文件的读写,可以实现大文件的高效传输,支持内存映射(Mmap)技术,能直接将文件映射到内存中。 5. **SocketChannel**:用于网络通信,可以建立TCP连接,进行非阻塞的读写。在`NIOServer....

    Java内存映射 大文件轻松处理

    Java中的内存映射文件操作主要依赖于`java.nio`包中的`MappedByteBuffer`类。`MappedByteBuffer`是一个特殊的`ByteBuffer`,它可以与文件内容直接关联,实现内存和文件的一对一映射。通过`FileChannel`的`map`方法,...

    commons-mmf.rar_java nio_java共享内存_共享内存

    在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集写入 ·07. 尚硅谷_NIO_字符集 Charset ·08. 尚硅谷_NIO_阻塞与非阻塞 ·09. 尚硅谷_NIO_阻塞式 ·10. 尚硅谷_NIO_非阻塞式 ·11. ...

    java NIO.zip

    6. **内存映射文件(Memory-Mapped Files)**: NIO允许将文件直接映射到内存,使得读写文件就像操作普通缓冲区一样快速。通过MappedByteBuffer类,可以直接在内存中对文件进行操作,提高大文件处理的性能。 7. **...

Global site tag (gtag.js) - Google Analytics