用java写了一段代码,想将一个很大的数据矩阵完全读入,但是发现会内存溢出,如果分块的话不知道怎么下手,这个矩阵的元素不稀疏,我先考虑用链表,后来又用哈希表加矩阵坐标存储,发现哈希表至多能存到62万个数就溢出了,不知道有什么好的方法
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
public class test8 {
public static void main(String[] args) throws IOException{

BufferedReader br = new BufferedReader(new FileReader("c://landuse.txt"));
String str = "";
int n=0;
int k=0;
HashMap map =new HashMap();
while((str=br.readLine())!=null){
//if(str==null) break;

nt ll=str.length();
//System.out.println(str);

for(int i=0;i<ll;i++)
{

char c=str.charAt(i);

//System.out.println(c);

if(c==' '&&n<ll&&n<i)

{//System.out.println(str);

//System.out.println(str.substring(n,i));

//System.out.println(str.substring(n,i)+" "+i);
if(Integer.parseInt(str.substring(n,i))!=-9999){
//map.put(str.substring(n,i),k+1);
map.put(k+1,str.substring(n,i));

//System.out.println(str.substring(n,i));
k=k+1;
System.out.println(k);
}
n=i+1;

//System.out.println(k);
}
else
{
continue;}
}
if(n<ll){

//System.out.println(str.substring(n,ll));

if(Integer.parseInt(str.substring(n,ll))!=-9999){

map.put(k+1,str.substring(n,ll));
//
//System.out.println(str.substring(n,ll));
k=k+1;
System.out.println(k);
}


}
n=0;

}

Iterator iterator = map.entrySet().iterator();
while(iterator.hasNext())
{
Entry entry = (Entry)iterator.next();
//System.out.print("[Key:"+ entry.getKey() +"--");
//System.out.println("Value:"+ entry.getValue()+"]");
}
//System.out.println(k);
}}

解决方案 »

  1.   

    你可以将数据分批读取 然后放在一个缓存内 例如memcached 它本身就是map形式存储
    不会占用你的应用内存
      

  2.   

    1.设置JVM允许使用的内存大小.
    2.在你的while((str=br.readLine())!=null){上面加一个记数器,由这个记数器来控制每次读多少行的数据.实现分块的读操作,直到读完为止.
      

  3.   

    大数据量,加大jvm支持内存是没有意义的,jvm也不是无限大,内存也不是,但是数据可能是,所以这种业务职能分块处理。
    如果你的数据有严格的数据结构,那么可以根据数据结构来分块。如果没有,那可以这么不,吧数据实体存放在硬盘中作为虚拟内存,然后读取一段数据进行当前处理,当发现到数据末端,就废弃或者缓存之前的一块数据,保存当前操作状态,然后再读取接下来的一段固定大小的数据,再接着处理,当然,根据业务的需要,你可能需要对大数据进行有序的分块和格式化。