博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构建高性能java程序-使用mapped file创建超大的矩阵
阅读量:5846 次
发布时间:2019-06-18

本文共 3594 字,大约阅读时间需要 11 分钟。

今天在一个博客中看到一个程序,使用mapped file机制,创建超大的矩阵,主要是为了节省内存,避免内存溢出异常。主要代码如下:
/** *  */package high.performace.java;import java.io.Closeable;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.util.ArrayList;import java.util.List;import sun.misc.Cleaner;import sun.nio.ch.DirectBuffer;public class LargeDoubleMatrix implements Closeable {    private static final int MAPPING_SIZE = 1 << 30;    private final RandomAccessFile raf;    private final int width;    private final int height;    private final List mappings = new ArrayList();    public LargeDoubleMatrix(String filename, int width, int height) throws IOException {        this.raf = new RandomAccessFile(filename, "rw");        try {            this.width = width;            this.height = height;            long size = 8L * width * height;            for (long offset = 0; offset < size; offset += MAPPING_SIZE) {                long size2 = Math.min(size - offset, MAPPING_SIZE);                mappings.add(raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size2));            }        } catch (IOException e) {            raf.close();            throw e;        }    }    protected long position(int x, int y) {        return (long) y * width + x;    }    public int width() {        return width;    }    public int height() {        return height;    }    public double get(int x, int y) {        assert x >= 0 && x < width;        assert y >= 0 && y < height;        long p = position(x, y) * 8;        int mapN = (int) (p / MAPPING_SIZE);        int offN = (int) (p % MAPPING_SIZE);        return mappings.get(mapN).getDouble(offN);    }    public void set(int x, int y, double d) {        assert x >= 0 && x < width;        assert y >= 0 && y < height;        long p = position(x, y) * 8;        int mapN = (int) (p / MAPPING_SIZE);        int offN = (int) (p % MAPPING_SIZE);        mappings.get(mapN).putDouble(offN, d);    }    public void close() throws IOException {        for (MappedByteBuffer mapping : mappings)            clean(mapping);        raf.close();    }    private void clean(MappedByteBuffer mapping) {        if (mapping == null) return;        Cleaner cleaner = ((DirectBuffer) mapping).cleaner();        if (cleaner != null) cleaner.clean();    }}
 
package high.performace.java;import java.io.IOException;public class LargeDoubleMatrixTest {	public void getSetMatrix(int x, int y) throws IOException {		long start = System.nanoTime();		final long used0 = usedMemory();		LargeDoubleMatrix matrix = new LargeDoubleMatrix("ldm.test", x * x, y * y);		for (int i = 0; i < matrix.width(); i++)			matrix.set(i, i, i);		for (int i = 0; i < matrix.width(); i++)			assert matrix.get(i, i) == i;		long time = System.nanoTime() - start;		final long used = usedMemory() - used0;		if (used == 0)			System.err.println("You need to use -XX:-UseTLAB to see small changes in memory usage.");		System.out.printf(				"Setting the diagonal took %,d ms, Heap used is %,d KB%n",				time / 1000 / 1000, used / 1024);		matrix.close();	}	private long usedMemory() {		return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();	}		public static void main(String[] args) throws IOException {		new LargeDoubleMatrixTest().getSetMatrix(Integer.parseInt(args[0]), Integer.parseInt(args[0]));	}}
  主要的核心思想,就是使用mapped file存储矩,由于mapped file不是存储在heap中的,极大的减小了heap的使用,避免了内存溢出的异常。而且能够减小内存的整体使用。这个思路,在做大数据存储计算的时候,很值得借鉴。例如java实现的cassandra在服务器端就采用了mapped的方式来存储数据。 [引用]

转载于:https://www.cnblogs.com/sing1ee/archive/2012/02/23/2765022.html

你可能感兴趣的文章
php5.6.3 + apache2.4.25 安装配置
查看>>
Velocity用法记录
查看>>
通过 ulimit 改善系统性能
查看>>
Java源码阅读的真实体会
查看>>
Uploadify v2. 1.0 使用解决的小问题
查看>>
★如何引导客户需求?几个经典的案例分析!
查看>>
空行会影响 Java 编译吗?
查看>>
Nginx中配置thinkphp的URL重写
查看>>
算法导论学习参考
查看>>
java实现多路分发
查看>>
Map 属性以JSON 形式存于数据库
查看>>
centos 网络配置(转)
查看>>
Objective-C中Sqlite3持久层框架
查看>>
Android WebView文件下载的常用方式
查看>>
Linux MySQL5.7多实例数据库配置
查看>>
prometheus源码阅读 - 规则管理与告警
查看>>
java开源软件和框架
查看>>
coreseek 词库 导入搜狗词库
查看>>
【xp专区】介绍Windows系统自动关机的设置方法
查看>>
防腐木的处理工序
查看>>