2013-10-15 2 views
2
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 значения в задачи метода. Я запускаю тот же метод с похожим файлом, и он отлично работает генотип.Запуск из памяти Java Затмение

Я использую jdk 1.6 Ubuntu 12.04, Eclipse kepler. INI-файл имеет -XX:MaxPermSize=256m -Xms740m -Xmx1412m

Запуск от конфигурации, как показано ниже: -Xms912m -Xmx2124m Своп память более 3,5 Гб.

Я смог выполнить эту задачу когда-нибудь, но, к сожалению, потерял все свои данные и пытаюсь все это снова установить. Я поставил огромное количество часов, чтобы исправить это, но ничего не помогает.

Это ошибка, я получаю: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

ответ

1

Наиболее вероятное объяснение состоит в том, что JVM работает из памяти. Для этого вам нужно знать, что параметр Xmx является верхним пределом того, что Java разрешено использовать независимо от того, какой ваш хост мог бы иметь доступный.

Вам нужно либо увеличить настройку Xmx, как -Xmx4g, и повторите попытку, либо перезапишите свой код, чтобы использовать меньше памяти.

+0

Разве он уже не делает этого? – Izmaki

+0

Он говорит, что его конфигурация времени выполнения составляет 2g. – TwoThe

+0

Мне, наконец, пришлось изменить мою систему, чтобы исправить это. Возможно, это были проблемы с пространством в моей среде Wubi-Ubuntu. Не уверен, хотя. –

1

Убедитесь, что параметры памяти, которые вы предоставляете, устанавливаются в поле аргументов VM, а не в поле параметров программы.

Я предлагаю распечатать значение Runtime.getRuntime().maxMemory(), чтобы узнать (в байтах), сколько памяти Java считает допустимым для проверки того, что параметр -Xmx был принят, и периодически печатать значение Runtime.getRuntime().totalMemory(), чтобы узнать, как сколько памяти ваши данные и сколько используется, прежде чем он сработает.

4

Ваши настройки JVM кажутся мне щедрыми. Я не понимаю, как сделать их крупнее.

Правильно ли я понимаю ваш код - читаете ли вы весь файл в памяти и затем перебираете все строки, чтобы анализировать записи на карте?

Если да, я бы переписал его, чтобы сохранить только одну строку в памяти за раз: прочитайте строку, проанализируйте ее, добавьте в карту, повторите.

Запустить VisualVM, чтобы узнать, где память потребляется при запуске. Это может быть глаз.

1

Я думаю, что вы находитесь вне размера «PermGen». Установите его как «-XX: MaxPermSize = 912m».

Пермское пространство используется для хранения информации для загруженных классов и нескольких других дополнительных функций, таких как String Pool. Refer: What is perm space?

Смежные вопросы