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

Creating dense matrix using org.javatuples.Pair and HashMap is too slow

我有一个大小约为 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 非常大(约 400M 行)并且该过程最终减慢到爬行,大部分时间花在 java.util.HashMap.put.

我认为成对不应该有 (m) 任何散列码冲突,但我可能是错的。我如何验证这一点?仅仅看一下 p12.hashCode()p12.hashCode() 有多独特就够了吗?

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

有没有更好的方法来构造这个矩阵以便快速查找?

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