2M
단어에서 50k
개의 단어로 매핑되는 텍스트 파일로 사전이 있습니다. 파일을 한 줄씩 읽고 구분 기호로 나누어 myMap.put(line[0], line[1])
을 호출하여이 파일을 HashMap<String, String>
으로 메모리에로드합니다. 텍스트 파일의 크기는 45MB
이고 HashMap은 350MB
의 힙을 사용합니다. 내 목표는 조회 속도를 손상시키지 않고 메모리 사용을 줄이는 것입니다. myMap.values().size()
은 50k
대신 2M
을 반환하며 값이 중복 된 것으로 저장되어 있음을 나타냅니다. 동일한 값을 동일한 String 객체를 가리키는 방법이 있습니까?중복 된 값이 HashMap에 저장 됨
Map<String, String> dict = new HashMap<>();
try (FileReader fr = new FileReader(FILE);
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
String key_value[] = line.split(":");
dict.put(key_value[0], key_value[1].intern());
}
} catch (Exception e) {
e.printStackTrace();
}
고유 한 단어가 50 만 개가 아닌 2M 개의 고유 단어가있는 경우 해시 맵의 크기는 2M이됩니다. – assylias
해시 맵 크기는 항목 수에 따라 달라 지므로 키 수입니다. 중복 값에 관하여 : JVM은 문자열 값으로 최적화를 수행합니다. 문자열은 불변이므로 동일한 문자열에 대해 동일한 객체를 사용하는 경우가 많습니다. 당신은 그 것에 의지 할 수는 없지만 아마도 당신의 문자열은 이미 복제되지 않았을 것입니다. –
@assylias 알아. 내 질문은 중복 값을 저장하지 않는 방법입니다. 여러 개의 키가 동일한 객체 값에 매핑되도록 가리키는 것입니다. – mossaab