现在正在编一Java程序,需要用到三个double类型数组。每个数组有元数1亿多个,三个数组共需内存2.3G左右。数组需要随机访问。
而在Windows下JVM内存最大就是1500M左右。显然这个问题很严重。
一个解决办法是把三个数组保存到硬盘上,但不知如何进行?且从硬盘上读取数据的策略需要优化才能使程序运行速度加快。
或者有什么其它的解决办法?例如随机从每个数组中任选一个元素相加求和,程序应当如何写?谢谢各位在此讨论。
源码样例如下:
public class memtest {
public double r[], aux[],score[];
int numNodes=105896555;

public void init() {
score = new double[ numNodes ];
r = new double[ numNodes ];
aux = new double[ numNodes ];
}

public static void main(String[] args) {
memtest m=new Memtest();
System.out.println("start...");
m.init();
System.out.println("finished.");
}}

解决方案 »

  1.   

    JVM内存最大就是1500M左右
      改了它.........
      我的C:\Program Files\MyEclipse 6.0\eclipse\eclipse.ini
        -showsplash
    com.genuitec.myeclipse.product
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Xms128m
    -Xmx512m
    -Duser.language=en 
    -XX:PermSize=512M 
    -XX:MaxPermSize=512M
    改了下面两个....运行完在改过来........嘿嘿
      

  2.   

    1. 这样说大概有3亿个数据,如果保存在数据库中的话,肯定是死路一条;
    2. 可考虑保存在三个独立的lucene中,保存时每个数要有一个ID,最好用int;
    3. 运行时,随机生成三个[0~1亿]之间数,分别根据这3个娄从lucene中查询,查询时间应该在毫秒级;
      

  3.   

    我的建议。
    自定义一个算法。把每个double用定长的字节写进文件。
    然后用RandomAccessFile。流可以一直开着。然后加上线程锁,根据索引算出文件指针的偏移量,进行读取。
    如果还想进行优化,可以根据读取的特性,自定义缓存。
      

  4.   

    补充一点,数组元素可能在计算过程中要修改。
    #9楼 
    我的建议。
    自定义一个算法。把每个double用定长的字节写进文件。
    然后用RandomAccessFile。流可以一直开着。然后加上线程锁,根据索引算出文件指针的偏移量,进行读取。
    如果还想进行优化,可以根据读取的特性,自定义缓存。这个方法可以试试