2014-12-29 5 views
1

대용량 데이터가 csv 파일에 있습니다. 250 만 개의 행이 있고 각 행에는 10 개의 필드가 있으며 각 행에 대한 해시 맵을 준비하고 해시 맵을 arraylist에 추가하려고합니다.hashmap 및 arraylist를 추가 할 때 메모리 부족 오류가 발생했습니다.

엄청난 양의 데이터가 메모리 부족으로 인해 수행 할 수 없습니다. 자바 힙 공간 오류.

그러나 내 응용 프로그램에는 해시 맵 목록이 필요합니다 (힙 공간을 늘릴 필요가 없습니다).

reader = new CSVReader(new FileReader(dataFile),','); 
     Map<String, String> feedMap = null; 
     String[] firstLine; 
     String[] nextLine; 
     String mappingKey = null; 
     String mappingValue = null; 
     //Read one line at a time 
     firstLine = reader.readNext(); 
     while ((nextLine = reader.readNext()) != null){ 
      int i = 0; 
      feedMap = new HashMap<String, String>(); 
      for(String token : nextLine){ 
       mappingKey = xmlNodeMap.get(firstLine[i]);      
       if (mappingKey != null) { 
        mappingValue = token.trim().length() > 0 ? token : Constants.NO_VALUE; 
        feedMap.put(mappingKey, mappingValue); 
       } 
       i++; 
     }     
     listOfMaps.add(feedMap); 
} 
+4

음, 많은 양의 데이터를 메모리에 저장하려면 많은 메모리가 필요합니다. 따라서 레코드별로 데이터 레코드를 처리하거나 메모리에 모두 저장하고 힙을 늘리십시오. 거기에 무료 점심도 없습니다. –

답변

0

당신은 [] 대신 String 객체의 사용 바이트를 시도 할 수 있습니다 : byte[] key = mappingKey.getBytes("UTF-8")

각 String 객체는 UTF-16 문자 집합을 포함합니다. 대부분의 경우 심볼 당 2 바이트를 의미합니다. UTF-8 인코딩은 ASCII 용으로 1 바이트를 사용하고 많은 유럽 언어 용으로 2 바이트를 사용합니다.

또한 각 String 개체에는 char 배열에 대한 참조가 들어 있습니다. 즉, 메모리 힙에 문자열과 문자 배열이라는 두 개의 객체가 있음을 의미합니다. 각 객체 (심지어 new Object()조차도)는 ~ 24 바이트 (Java VM 및 옵션 버전에 따라 다름)의 비용이 듭니다.

따라서 요소 수 (쌍 String + char [] 대신에 1 바이트 []) 및 UTF-8 기호의 배열 길이는 대개 UTF-16 문자 길이보다 작을 수 있습니다.

2

이것은 glib로 들리지만 문제는 응용 프로그램에 250 만 행의 목록이 HashMaps로 필요하다는 것입니다.

이것은 터무니없고 비합리적이며 솔직하게 우스운 요구 사항입니다. 나는 그러한 데이터 구조를 사용하는 것이 좋을 것이라고 상상할 수 없다.

필요없는 응용 프로그램으로 변경하십시오.

+0

글쎄, finnaly 우리는 각각의 전체 파일 크기를 기반으로 1,00,000 행으로 파일을 분할, 그럼 우리는 파일의 목록을 사용하여 DB에있는 모든 단일 파일과 프로세스에 대한지도에 추가했습니다. –

0

전적으로 Bohemian 답변에 동의합니다.

도움을 받으려면 파일을 한 번 읽고 메모리에 모든 것을 보관하는 대신 한 번 읽고 "색인 맵"을 유지해야합니다 (필요에 따라). 그런 다음 파일에 대한 연구를해야 할 때 스트림을 다시 열고 "색인 맵"을 사용하여 검색에 소요되는 시간을 최적화해야합니다.

위의 솔루션은 파일 액세스에 크게 의존하므로 효율적인 액세스를 위해 java.nio을 살펴보십시오.

관련 문제