我正在运行一个Java程序,它从一个大到1.2 GB的文件中逐行读取,并且在某些时候它会尝试将它们放入哈希值。在调用taxhash.put(tmpgi,tmptax)一段时间后,它给出了java.lang.OutOfMemoryError错误。
我尝试并更改了eclipse.ini选项,如下所示
-startup
plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.2.R36x_v20101222
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms2048m
-Xmx3548m
和BTW我在64位win 7上使用4GB内存运行我的代码。这是从文件中读取的代码!
boolean readfile(String filename,int verbose){
//this should read the inputfile and save the data in it to the gitax array.
taxhash=new HashMap();
int currnum=0;
try{
BufferedReader inread=new BufferedReader(new FileReader(filename));
String instring;
String[] tmparr;
Integer tmpgi;
Integer tmptax;
if(verbose>0){
while ((instring=inread.readLine())!=null){
currnum++;
instring=instring.trim();
tmparr=instring.split("\\s+",0);//split on one or more whitespaces
//now I should have two elements in this array, the gi number and the taxid
if(java.lang.reflect.Array.getLength(tmparr)!=2){
System.err.println("Error reading from "+filename+" "+java.lang.reflect.Array.getLength(tmparr)+" elements.");
}else{
try{
tmpgi=Integer.valueOf(tmparr[0]);
tmptax=Integer.valueOf(tmparr[1]);
}catch (NumberFormatException e){
System.err.println("unable to parse number from "+tmparr[0]+" "+tmparr[1]);
return false;
}
taxhash.put(tmpgi,tmptax);
}
if(currnum==100000){
System.out.print(".");
currnum=0;
}
}
}else{
while ((instring=inread.readLine())!=null){
instring=instring.trim();
tmparr=instring.split("\\s+",0);//split on one or more whitespaces
//now I should have two elements in this array, the gi number and the taxid
if(java.lang.reflect.Array.getLength(tmparr)!=2){
System.err.println("Error reading from "+filename+" "+java.lang.reflect.Array.getLength(tmparr)+" elements.");
}else{
try{
tmpgi=Integer.valueOf(tmparr[0]);
tmptax=Integer.valueOf(tmparr[1]);
}catch (NumberFormatException e){
System.err.println("unable to parse number from "+tmparr[0]+" "+tmparr[1]);
return false;
}
taxhash.put(tmpgi,tmptax);
}
}
}
}catch (IOException e){
System.err.println("IOError in reading from "+filename);
e.printStackTrace();
return false;
}
return true;
}// end readfile
这是线程“main”
中更多细节异常的错误Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at com.ali.Blammer.taxid.readfile(taxid.java:79)
at com.ali.Blammer.taxid.readfile(taxid.java:50)
at com.ali.Blammer.main.run(main.java:182)
at com.ali.Blammer.blammer.main(blammer.java:36)
at com.ali.Interface.main.main(main.java:53)
答案 0 :(得分:2)
您正在更改影响eclipse
JVM的内存选项,而不是您运行的程序的内存选项。
在“运行”配置中,第二个选项卡允许为运行执行设置JVM参数。无论如何,我怀疑你会在512 MB中放入1.2GB的文件(加上哈希和其他开销)
答案 1 :(得分:1)
您需要更改程序的大小而不是eclipse。由于你要存储1.2 GB的文本,你需要至少2.4 Gb的内存,但我怀疑需要更接近4 GB(带有开销)
由于您有一台小型机器,我建议您逐步处理该文件,以尽量减少内存消耗。
BTW:您可以使用比HashMap小得多的TIntIntHashMap(最多可缩小4倍),但对于您的数据集来说仍然可能太多了。