现在正在编一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.");
}}
而在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.");
}}
改了它.........
我的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. 可考虑保存在三个独立的lucene中,保存时每个数要有一个ID,最好用int;
3. 运行时,随机生成三个[0~1亿]之间数,分别根据这3个娄从lucene中查询,查询时间应该在毫秒级;
自定义一个算法。把每个double用定长的字节写进文件。
然后用RandomAccessFile。流可以一直开着。然后加上线程锁,根据索引算出文件指针的偏移量,进行读取。
如果还想进行优化,可以根据读取的特性,自定义缓存。
#9楼
我的建议。
自定义一个算法。把每个double用定长的字节写进文件。
然后用RandomAccessFile。流可以一直开着。然后加上线程锁,根据索引算出文件指针的偏移量,进行读取。
如果还想进行优化,可以根据读取的特性,自定义缓存。这个方法可以试试