用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);
}}
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);
}}
不会占用你的应用内存
2.在你的while((str=br.readLine())!=null){上面加一个记数器,由这个记数器来控制每次读多少行的数据.实现分块的读操作,直到读完为止.
如果你的数据有严格的数据结构,那么可以根据数据结构来分块。如果没有,那可以这么不,吧数据实体存放在硬盘中作为虚拟内存,然后读取一段数据进行当前处理,当发现到数据末端,就废弃或者缓存之前的一块数据,保存当前操作状态,然后再读取接下来的一段固定大小的数据,再接着处理,当然,根据业务的需要,你可能需要对大数据进行有序的分块和格式化。