2014-02-04 3 views
0

Я пытаюсь прочитать файл JSON и выполнять некоторые операции. Этот файл JSON находится в Amazon S3 и составляет 500 МБ. Будущие файлы будут в TeraBytes. Ниже мой код.java.lang.OutOfMemoryError: ошибка кучи Java в моем коде

public void createHash() throws IOException 
    { 
     System.out.println("Hash Creation Started"); 

     strBuffer = new StringBuffer(""); 


     try 
     { 
      //List all the Buckets 
      List<Bucket>buckets = s3.listBuckets(); 

      for(int i=0;i<buckets.size();i++) 
      { 
       System.out.println("- "+(buckets.get(i)).getName()); 
      } 


      //Downloading the Object 
      System.out.println("Downloading Object"); 
      S3Object s3Object = s3.getObject(new GetObjectRequest(inputBucket, inputFile)); 
      System.out.println("Content-Type: " + s3Object.getObjectMetadata().getContentType()); 


      //Read the JSON File 
      /*BufferedReader reader = new BufferedReader(new InputStreamReader(s3Object.getObjectContent())); 
      while (true) { 
       String line = reader.readLine(); 
       if (line == null) break; 

       // System.out.println(" " + line); 
       strBuffer.append(line); 

      }*/ 

      JSONTokener jTokener = new JSONTokener(new BufferedReader(new InputStreamReader(s3Object.getObjectContent()))); 
      jsonArray = new JSONArray(jTokener); 

      System.out.println("Json array length: "+jsonArray.length()); 


      for(int i=0;i<jsonArray.length();i++) 
      { 
       JSONObject jsonObject1 = jsonArray.getJSONObject(i); 
       StringBuffer hashIndex = new StringBuffer(""); 

       //Add Title and Body Together to the list 
       String titleAndBodyContainer = jsonObject1.getString("title")+" "+jsonObject1.getString("body"); 


       //Remove full stops and commas 
       titleAndBodyContainer = titleAndBodyContainer.replaceAll("\\.(?=\\s|$)", " "); 
       titleAndBodyContainer = titleAndBodyContainer.replaceAll(",", " "); 
       titleAndBodyContainer = titleAndBodyContainer.toLowerCase(); 


       //Create a word list without duplicated words 
       StringBuilder result = new StringBuilder(); 

       HashSet<String> set = new HashSet<String>(); 
       for(String s : titleAndBodyContainer.split(" ")) { 
        if (!set.contains(s)) { 
         result.append(s); 
         result.append(" "); 
         set.add(s); 
        } 
       } 
       //System.out.println(result.toString()); 


       //Re-Arranging everything into Alphabetic Order 
       String testString = "acarpous barnyard gleet diabolize acarus creosol eaten gleet absorbance"; 
       //String testHash = "057  1$k  983 5*1  058  52j 6!v 983  03z"; 

       String[]finalWordHolder = (result.toString()).split(" "); 
       Arrays.sort(finalWordHolder); 


       //Navigate through text and create the Hash 
       for(int arrayCount=0;arrayCount<finalWordHolder.length;arrayCount++) 
       { 


        if(wordMap.containsKey(finalWordHolder[arrayCount])) 
        { 
         hashIndex.append((String)wordMap.get(finalWordHolder[arrayCount])); 
        } 

       } 

       //System.out.println(hashIndex.toString().trim()); 

       jsonObject1.put("hash_index", hashIndex.toString().trim()); //Add the Hash to the JSON Object 
       jsonObject1.put("primary_key", i); //Create the primary key 
       jsonObjectHolder.add(jsonObject1); //Add the JSON Object to the JSON collection 

       jsonHashHolder.add(hashIndex.toString().trim()); 

       System.out.println("JSON Number: "+i); 

       //System.out.println(Arrays.toString(finalWordHolder)); 
       //System.out.println("- "+hashIndex.toString()); 

       //break; 

      } 

      System.out.println("Hash Creation Completed"); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

Но при выполнении кода возникает следующая ошибка.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at java.util.Arrays.copyOf(Arrays.java:2894) 
     at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117) 
     at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:589) 
     at java.lang.StringBuffer.append(StringBuffer.java:337) 
     at com.amazonaws.util.json.JSONTokener.nextString(JSONTokener.java:284) 
     at com.amazonaws.util.json.JSONTokener.nextValue(JSONTokener.java:348) 
     at com.amazonaws.util.json.JSONObject.<init>(JSONObject.java:222) 
     at com.amazonaws.util.json.JSONTokener.nextValue(JSONTokener.java:351) 
     at com.amazonaws.util.json.JSONArray.<init>(JSONArray.java:125) 
     at HashCreator.createHash(HashCreator.java:215) 
     at HashCreator.<init>(HashCreator.java:61) 
     at Main.main(Main.java:9) 
[[email protected] JarFiles]# 

Это говорит о том, номер строки 215, и именно этот код - jsonArray = new JSONArray(jTokener);

Что здесь происходит, и как я могу решить эту проблему?

Редактировать

Это мой JSON код:

[ 
    { 
     "hash_index": "00102x05h06l0aj0dw", 
     "body": "Who's signing up for Obamacare?", 
     "_type": "ArticleItem", 
     "title": "Who's signing up for Obamacare? - Jan. 13, 2014", 
     "source": "money.cnn.com", 
     "primary_key": 0, 
     "last_crawl_date": "2014-01-14", 
     "url": "http://money.cnn.com/2014/01/13/news/economy/obamacare-enrollment/index.html" 
    }, 
    { 
     "hash_index": "[email protected]#0", 
     "body": "Who's signing up for Obamacare?", 
     "_type": "ArticleItem", 
     "title": "Who's signing up for Obamacare? - Jan. 13, 2014", 
     "source": "money.cnn.com", 
     "primary_key": 1, 
     "last_crawl_date": "2014-01-14", 
     "url": "http://money.cnn.com/2014/01/13/news/economy/obamacare-enrollment/index.html" 
    } 
] 

Во всяком случае, пожалуйста, не дают мне решение "увеличить размер кучи". Это не решение, это «штукатурка».

+0

Файл - это только один большой объект JSON? –

+0

@SotiriosDelimanolis: Привет, это большой файл JSON. Это массив JSON. –

+0

@SotiriosDelimanolis: Пожалуйста, взгляните на редактирование. Вы можете понять :) –

ответ

0

просто увеличить размер кучи:

java -Xmx2g myprogram 
+1

OP должен заметить, что 2g - это размер памяти, изменение зависит от того, что вы хотите сделать. – BitNinja

0

кучи, где экземпляры объектов хранятся. Рассмотрите область вашей программы, попробуйте посмотреть, создаете ли вы экземпляры, которые хранятся в пределах области видимости. Это справедливо для метода, который вызвал ваш createHash(), он может удерживать его собственные объекты в своей области.

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

Увеличение размера вашей кучи поможет, но это может только задержать проблему.

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