如何把access数据库文件映射到windows 内存映射

MappedByteBuffer的windows 内存映射释放主要由垃圾回收引起的。首先来看一下Oracle的 ,这是一个无法修复的bug所以在使用MappedByteBuffer的时候一定要注意windows 内存映射的释放。

删除文件失败!原因是没有释放windows 内存映射

将buffer引用设为null,还是失败我们都知道,垃圾回收器不保证立即回收垃圾是不可靠的。添加注释掉的代码:

会显示的进行垃圾回收但是同样地,这是没法保证的我在本机上运行了10000次,失败了五六次 究其原因,FileChannel在调用了map方法进行windows 内存映射映射得到MappedByteBuffer,但是没有提供unmap方法()释放windows 内存映射。事实上unmap方法是在FileChannelImpl类里实现的,是个私有方法在finalize延迟的时候,unmap方法无法调用在删除文件的时候就会因为windows 内存映射未释放而失败。不过可以通过显示的调用unmap方法来释放windows 内存映射

则可以保证,成功释放windows 内存映射 在别的地方也找到类似的处理方法不过是让buffer本身来释放windows 内存映射:

这是一个私有方法,调用了Cleaner的clean方法来释放windows 内存映射所以我们也可以直接在代码里使用以上代码来释放windows 內存映射。

把SRTM的数据读写了一下可以用。

JAVAwindows 內存映射映射文件:

windows 内存映射映射文件能让你创建和修改那些因为太大而无法放入windows 内存映射的文件有了windows 内存映射映射文件,你就可以认為文件已经全部读进了windows 内存映射然后把它当成一个非常大的数组来访问。这种解决办法能大大简化修改文件的代码
fileChannel.map(FileChannel.MapMode mode, long position, long size)将此通道的文件区域直接映射到windows 内存映射中。注意你必须指明,它是从文件的哪个位置开始映射的映射的范围又有多大;也就是说,它还可以映射一个夶文件的某个小片断


MappedByteBuffer是ByteBuffer的子类,因此它具备了ByteBuffer的所有方法但新添了force()将缓冲区的内容强制刷新到存储设备中去、load()将存储设备中的数据加載到windows 内存映射中、isLoaded()位置windows 内存映射中的数据是否与存储设置上同步。这里只简单地演示了一下put()和get()方法除此之外,你还可以使用asCharBuffer( )之类的方法嘚到相应基本类型数据的缓冲视图后可以方便的读写基本类型数据。

// 为了以可读可写的方式打开文件这里使用RandomAccessFile来创建文件。 //注意文件通道的可读可写要建立在文件流本身可读写的基础之上 //读取文件中间6个字节内容

尽管映射写似乎要用到FileOutputStream,但是映射文件中的所有输出 必須使用RandomAccessFile但如果只需要读时可以使用FileInputStream,写映射文件时一定要使用随机访问文件可能写时要读的原因吧。

该程序创建了一个128Mb的文件如果┅次性读到windows 内存映射可能导致windows 内存映射溢出,但这里访问好像只是一瞬间的事这是因为,真正调入windows 内存映射的只是其中的一小部分其餘部分则被放在交换文件上。这样你就可以很方便地修改超大型的文件了(最大可以到2 GB)注意,Java是调用操作系统的"文件映射机制"来提升性能嘚

版权声明:本文为博主原创文章未经博主允许不得转载。 /Timmiy/article/details/

当我们对文件进行读写操作的时候我们经常会调用ReadFile和WriteFile这两个API,但是如果我们的文件较大几百兆甚至几G且需偠时常修改值B的时候,这时那两个函数可能就不大好了这时微软提供了另外一种方法--文件映射,来使我们进行文件操作

LPBYTE pBuf = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 10); //虽然这里只映射10个字节,但是系统却并不只是映射10个字节系统会做一个跟硬盘的一个扇区大小做对齐,一般来说一个扇区为512个字节,若不够一个扇區则默认映射一个扇区,总之映射的大小为扇区大小的整数倍 //将第三个字节和第四个字节改为1和2 //将更新的内容刷新到文件中

我要回帖

更多关于 windows 内存映射 的文章

 

随机推荐