Memory-mapped files

来源:互联网 发布:ubuntu 开机自启动命令 编辑:程序博客网 时间:2024/06/07 10:50

I/O 速度快慢: 

   Memory-mapped files 映射文件>nio  stream i/o 新输入输出>old stream i/o 旧输入输出

一、操作系统内存使用情况,下面的缓冲是内存条缓存。

 

             1>为硬件保留  115 

             2>正在使用(表示 操作系统和其它程序正在用的内存)2961

             3>已修改(这部分不能用,用之前必须存到硬盘上)表示里面放了缓存的数据和代码,是活动的, 19

             4>备用:表示里面放了缓存的数据和代码,但是不活动。

             5>可用(free):表示空闲的,谁都可以用

             已安装=1>+2>+3>+4>+5>

             总数=已安装-为硬件保留  115 

             缓冲=备用+ 已修

             可用= 备用+可用(free)                 

            可变:2>,3>,4> , 5>

           不可变:已安装,总数,为硬件保留

二、例子

 1、 Memory-mapped files:建立1.5G的文件,当前内存不够,但是也允许你去建立这个文件。

例如:1>建立一个1.5 G的.txt文件

2>观察当前的系统,可用的内存大约 1G,所以Memory-mapped files 假装可以装下。

目前我的操作系统允许最大是,4G,即一个int的字节数2^32-1=4G。

package io;

import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import static net.mindview.util.Print.*;

public class LargeMappedFiles {
  //length <MAX_VALUE = 0x7fffffff=2^32-1=2^10*2^10*2^10*2^2=4G

static int length = 0x4FFFFFFF; // 1.5G

public static void main(String[] args) throws Exception {
MappedByteBuffer out = new RandomAccessFile("test.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);
for (int i = 0; i < length; i++)
out.put((byte) 'x');
print("Finished writing");
for (int i = length / 2; i < length / 2 + 6; i++)
printnb((char) out.get(i));
}
}

三、类说明:

     1、ByteBuffer:就像一个放东西仓库,只和Channel 打交道,表示东西从仓库 移 到通道,从通道 搬到仓库。

         1》 lim容量:能装多少东西 

         2》mark=pos:现在开始往仓库放东西的位置,buffer.mark()

             pos:目前放、取东西位置。

             put():表示正在放东西,pos+1.

             get():表示正在取出东西 ,pos+1

        3》reset():pos值=mark  表示回到刚放东西的位置。

        4》 rewind():pos=mark=0 表示空仓库。

   2、允许一些人往仓库放东西,出现一大堆view 类

       1》asLongBuffer :只放 Long

       2》asShortBuffer():

     等原始类型。

 3、MappedByteBuffer 其实 也是  ByteBuffer 类,只是加了一些功能

     1》.map(FileChannel.MapMode.READ_WRITE, 0, length):调用这个方法,就有MappedByteBuffer,ByteBuffer 对象。

          MapMode:很重要,告诉通道,准备搬东西进仓库或是把仓库东西搬到通道

           length:告诉通道,有多少东西需要到通道中,(不然通道没有准备额)


0 0
原创粉丝点击