【发布时间】:2017-10-28 09:15:54
【问题描述】:
假设我有这个数组列表 ['a', 'b', 'xx']。 我想提取每 2 个字符串组合(每 2 个元素)。例如 ['a','b'] ['a', 'xx'] ['b', 'a'] ['b', 'xx'] ['xx', 'a'] ['xx ', 'b']。
我已经编写了这段代码,但是当数组变得非常大时(10k 例如)GC 耗尽内存。
private Text empty = new Text("");
public void start(Iterable<Text> values,Context context) throws {
List<String> sitesArr = new ArrayList<String>();
HashMap<String, String> hmapPairs = new HashMap<String, String>();
for (Text site : values){
sitesArr.add(site.toString());
}
insertPairsToHash(hmapPairs, sitesArr);
writeContextFromHash(hmapPairs, context);
}
private void insertPairsToHash(HashMap<String, String> hmapPairs, List<String> sitesArr) {
for (int i=0; i<sitesArr.size(); i++) {
for (int j=i+1; j<sitesArr.size(); j++) {
String firstPair = sitesArr.get(i) + "_" + sitesArr.get(j);
String secondPair = sitesArr.get(j) + "_" + sitesArr.get(i);
hmapPairs.put(firstPair,secondPair);
}
}
}
private void writeContextFromHash(HashMap<String, String> hmapPairs, Context context) throws IOException, InterruptedException {
Text textTowriteToFile = new Text("");
for(Map.Entry<String, String> entry : hmapPairs.entrySet()) {
textTowriteToFile.set(entry.getKey());
context.write(textTowriteToFile, empty);
textTowriteToFile.set(entry.getValue());
context.write(textTowriteToFile, empty);
}
}
我使用 2 个 for 循环,在每次迭代中我插入 2 个组合( ['a', 'b'] 和 ['b','a'] 第一个元素是键,第二个是值,所以在 [ 'a','b'] 'a' 将是键,'b' 将是值,反之亦然)到散列。 然后我遍历散列一次以发送值。 如何在使用更少内存的同时使其更快?
【问题讨论】:
-
我不认为
insertPairsToHash()做你想做的事:计算所有可能的有序依赖组合。 -
仅适用于 2 双
-
你有内存问题吗?抛出内存错误时,您应该提供更多信息,例如 stracktrace。
标签: java arrays algorithm hash hashmap