public class Functions {
public Functions (){
}
Map<String, Set<String>> task() throws Exception{
System.out.println("start reading for strain file");
String value= "/home/charles/Documents/mmp.txt";
File file = new File(value);
FileInputStream fin = new FileInputStream(file);
FileChannel fc = fin.getChannel();
MappedByteBuffer mapByteBuff = fc.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
byte[] buffer= new byte[(int)fc.size()];
mapByteBuff.get(buffer);
BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(buffer)));
Map<String, Set<String>> strainHashMap = new HashMap<String, Set<String>>(824*12+1,2);
String line = br.readLine();
// String delim="[\t]";
String[] tokens=new String[3];
// String delim="[\t]";
for (line = br.readLine(); line != null; line = br.readLine()) {
// tokens=new String[3];
tokens=line.split("[\t]",3);
//here is where I am stuck.. I get java out of heap memory
Set<String> strainSet = strainHashMap.get(tokens[1]);
if(strainSet==null){
strainSet = new HashSet<String>();
strainSet.add(tokens[2]);
strainHashMap.put(tokens[1],strainSet);
}
else{
strainSet.add(tokens[2]);
strainHashMap.put(tokens[1], strainSet);
}
if(strainHashMap.size() % 600000 ==0){
System.out.println("strain"+strainHashMap.size());
}
if(strainHashMap.size() % 610000 ==0){
System.out.println("strain"+strainHashMap.size());
}
if(strainHashMap.size() % 620000 ==0){
System.out.println("strain"+strainHashMap.size());
}
if(strainHashMap.size() % 650000 ==0){
System.out.println("strain"+strainHashMap.size());
}
if(strainHashMap.size() % 700000 ==0){
System.out.println("strain"+strainHashMap.size());
}
if(strainHashMap.size() % 851000 ==0){
System.out.println("strain"+strainHashMap.size());
}
}
fc.close();
fin.close();
System.out.println("The hash stain is " + strainHashMap.size());
// System.out.println("The Genotype is " + mapGenotype.size());
System.out.println("moving out of strain function");
return strainHashMap;
}
public Map<String, Genotype> genotype() throws Exception {
// TODO Auto-generated method stub
System.out.println("entering genotype data function");
// TODO Auto-generated method stub
String value= "/home/charles/Documents/mmp.txt";
File file = new File(value);
FileInputStream fin = new FileInputStream(file);
FileChannel fc = fin.getChannel();
MappedByteBuffer mapByteBuff = fc.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
byte[] buffer= new byte[(int)fc.size()];
mapByteBuff.get(buffer);
BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(buffer)));
Map<String, Genotype> mapGenotype = new HashMap<String, Genotype>(824*12+1,2);
String line = br.readLine();
// String delim="[\t]";
String[] tokens=new String[8];
// String delim="[\t]";
for (line = br.readLine(); line != null; line = br.readLine()) {
tokens=new String[8];
tokens=line.split("[\t]",8);
// tokens=line.split(delim);
// Genotype genotypeObject = new Genotype();
// genotypeObject.setChromsomeName(tokens[3]);
// genotypeObject.setMutation(tokens[6]);
// genotypeObject.setPosition(Double.parseDouble(tokens[4]));
//genotypeObject.setPosition(Double.parseDouble(tokens[4]));
// genotypeObject.setRef(tokens[5]);
if(!mapGenotype.containsKey(tokens[1])){
Genotype genotypeObject = new Genotype();
genotypeObject.setChromsomeName(tokens[3]);
genotypeObject.setMutation(tokens[6]);
genotypeObject.setPosition(Double.parseDouble(tokens[4]));
//genotypeObject.setPosition(Double.parseDouble(tokens[4]));
genotypeObject.setRef(tokens[5]);
mapGenotype.put(tokens[1], genotypeObject);
}
if(mapGenotype.size() % 700000 ==0){
System.out.println(mapGenotype.size());
}
if(mapGenotype.size() % 650000 ==0){
System.out.println(mapGenotype.size());
}
if(mapGenotype.size() % 851000 ==0){
System.out.println(mapGenotype.size());
}
}
fc.close();
fin.close();
System.out.println("leaving Genotype method of function");
return mapGenotype;
}
}
奇怪的是,在哈希映射在任务方法中添加了650000个值后,内存不足。 我使用类似的文件运行相同的方法,它完全正常基因型。
我正在使用jdk 1.6
Ubuntu 12.04,Eclipse kepler。
.ini文件包含-XX:MaxPermSize=256m -Xms740m -Xmx1412m
以配置方式运行如下: -Xms912m -Xmx2124m 交换内存超过3.5 GB。
我之后能够完成这项任务,但不幸的是,我丢失了所有数据,并试图重新设置这一切。 我花了很多时间来解决这个问题,但似乎没有任何帮助。
这是我得到的错误:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
答案 0 :(得分:4)
您的JVM设置对我来说似乎很慷慨。我不知道如何让它们更大会有所帮助。
我是否正确理解您的代码 - 您是否将整个文件读入内存,然后遍历所有行以解析Map中的条目?
如果是,我会将其重写为一次只在内存中保留一行:读取一行,解析它,添加到地图,重复。
运行VisualVM以查看运行时内存消耗的位置。这可能令人大开眼界。
答案 1 :(得分:1)
最可能的解释是JVM内存不足。为此,您需要知道Xmx设置是允许使用Java的上限,无论您的主机可用什么。
因此您需要增加像-Xmx4g
这样的Xmx设置并重试,或者重写代码以减少内存使用。
答案 2 :(得分:1)
确保您提供的内存参数在VM参数框中设置,而不是在程序参数框中设置。
我建议打印Runtime.getRuntime().maxMemory()
的值以查找(以字节为单位)Java认为可以使用多少内存来检查-Xmx参数是否被接受,并定期打印{的值{1}}查看数据占用的内存量以及崩溃前的使用量。
答案 3 :(得分:1)
我认为你超出了“PermGen”的大小。设置为“-XX:MaxPermSize = 912m”。
Perm空间用于保存已加载类的信息以及String Pool等其他一些高级功能。请参阅:What is perm space?