[英]Optimizing a HashMap with iteration
我有一個包含30萬條記錄的ResultSet
,並且我正在執行以下操作來對其進行迭代(以及收集到的其他操作)。 此過程大約需要2分鍾才能完成。 有什么方法可以優化它嗎?
Map<String,Map<String,String>> internalMap = new HashMap<String,Map<String,String>>();
while (resultSet.next()) {
final Integer val1 = resultSet.getInt("val1");
final String val2 = resultSet.getString("val2");
final String val3 = resultSet.getString("val3");
final String val4 = resultSet.getString("val4");
final String type = resultSet.getString("type");
final String id = resultSet.getString("id");
addIntern(internalMap,val2,val1,val3,val4,type,id);
}
以及addIntern
方法
private static void addIntern(Map<String,Map<String,String>> internalMap, String val2, Integer val1,
String val3,String val4,String type,String id) {
String key = id+"##"+val4;
if (internalMap.get(key) == null) {
internalMap.put(key, new HashMap<String,String>());
}
internalMap.get(key).put("val3", val3);
internalMap.get(key).put("val2", val2);
if("create".equals(type)){
internalMap.get(key).put("create", val1.toString());
}
if("update".equals(type)){
internalMap.get(key).put("update", val1.toString());
}
if("delete".equals(type)){
internalMap.get(key).put("delete", val1.toString());
}
}
調整您的resultSet
的獲取大小;
resultSet.setFetchSize(100);
而且您當然可以簡化您的add方法(每個get是一個O(1)
調用,但它們相加),例如
private static void addIntern(Map<String, Map<String, String>> internalMap, String val2, Integer val1, String val3,
String val4, String type, String id) {
String key = id + "##" + val4;
Map<String, String> kMap;
if (internalMap.containsKey(key)) {
kMap = internalMap.get(key);
} else {
kMap = new HashMap<>();
internalMap.put(key, kMap);
}
kMap.put("val3", val3);
kMap.put("val2", val2);
if ("create".equals(type) || "update".equals(type) || "delete".equals(type)) {
kMap.put(type, val1.toString());
}
}
您將無法優化太多,因為您無法減少迭代次數。
但是我可以看到可以做的一項更改
if("create".equals(type)){
internalMap.get(key).put("create", val1.toString());
}
if("update".equals(type)){
internalMap.get(key).put("update", val1.toString());
}
if("delete".equals(type)){
internalMap.get(key).put("delete", val1.toString());
}
上面也可以寫成如下
internalMap.get(key).put(type, val1.toString());
如果進行檢查,這將刪除300k或更多。
當您的type
只能包含create/update/delete
值時,這將起作用。 如果更多,則可以輸入一個if
來檢查它是否等於3中的任何一個。
嘗試這個。 (Java 8)
private static void addIntern(Map<String,Map<String,String>> internalMap,
String val2, Integer val1,
String val3,String val4,String type,String id) {
String key = id+"##"+val4;
Map<String, String> valueMap = internalMap.computeIfAbsent(key, k -> new HashMap<>());
valueMap.put("val3", val3);
valueMap.put("val2", val2);
if("create".equals(type) || "update".equals(type) || "delete".equals(type))
valueMap.put(type, val1.toString());
}
如果您有足夠的可用堆空間,則設置映射初始容量可能會有所幫助:
Map<String,Map<String,String>> internalMap = new HashMap<String,Map<String,String>>(300000*2);
通過使用默認的初始容量,由於要添加300000項,所以必須多次重新映射internalMap。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.