使用org.javatuples.Pair和HashMap创建密集矩阵太慢了

时间:2016-03-31 18:53:39

标签: java matrix hashmap collision

我有一个密集的对称矩阵,大小约为30000 X 30000,包含字符串之间的距离。由于距离是对称的,矩阵的上三角形存储在一个以制表符分隔的3列文件中

stringA<tab>stringB<tab>distance

我正在使用HashMaporg.javatuples.Pair创建一个地图,以快速查找给定字符串对的距离,如下所示:

import org.javatuples.Pair;

HashMap<Pair<String,String>,Double> pairScores = new HashMap<Pair<String,String>,Double>();

BufferedReader bufferedReader = new BufferedReader(new FileReader("data.txt"));
String line = null;

while((line = bufferedReader.readLine()) != null) {
    String [] parts = line.split("\t");
    String d1 = parts[0];
    String d2 = parts[1];
    Double score = Double.parseDouble(parts[2]);
    Pair<String,String> p12 = new Pair<String,String>(d1,d2);
    Pair<String,String> p21 = new Pair<String,String>(d2,d1);
    pairScores.put(p12, score);
    pairScores.put(p21, score);
}

data.txt非常大(约400万行),并且该过程最终变慢为爬行,大部分时间花在java.util.HashMap.put上。

我不认为(m)对上应该有任何哈希码冲突,但我可能错了。我该如何验证?仅仅查看p12.hashCode()p12.hashCode()的唯一性是否足够?

如果没有碰撞,还有什么可能导致减速?

有没有一种方法来构建这个矩阵以便快速查找?

1 个答案:

答案 0 :(得分:0)

我现在正在使用Guava's Table<Integer, Integer, Double>之后也意识到我的字符串足够独特,我可以使用它们的哈希值而不是字符串本身作为键来减少内存需求。表的创建在合理的时间内运行,但是,对结果对象进行序列化和反序列化存在问题:即使从String移动到Integer,我也遇到了内存不足错误。在我决定不存储a-bb-a对之后,它似乎正在工作,但我可能在我的机器可以处理的边缘上保持平衡