我有一个字典作为从2M单词到50k单词的文本文件映射.我将此文件加载到内存中HashMap<String, String>,方法是逐行读取文件,在分隔符上拆分并调用myMap.put(line[0], line[1]).文本文件的大小是45MB,而HashMap使用350MB堆.我的目标是在不损害查找速度的情况下减少内存使用.
myMap.values().size()返回2M而不是50k,建议将值存储为重复值.有没有办法让相同的值指向同一个String对象?
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();
}
Run Code Online (Sandbox Code Playgroud)
无论重复是否指向相同的对象,仍然需要引用这些对象,因此size仍应返回包含重复项的大小.
如果您希望重复项指向相同的对象,则必须在此之外执行此操作,HashMap或希望优化程序处理它.
String.intern()作为joe776建议的替代方案可能是自编写的集合,其中一些Set(因为Set没有Object get(Object)方法)或另一个HashMap(具有指向自身的对象)允许您获得对公共对象的引用.
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |