我有一个密集的对称矩阵,大小约为30000 X 30000,包含字符串之间的距离。由于距离是对称的,矩阵的上三角形存储在一个以制表符分隔的3列文件中
stringA<tab>stringB<tab>distance
我正在使用HashMap
和org.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()
的唯一性是否足够?
如果没有碰撞,还有什么可能导致减速?
有没有一种方法来构建这个矩阵以便快速查找?
答案 0 :(得分:0)
我现在正在使用Guava's Table<Integer, Integer, Double>
之后也意识到我的字符串足够独特,我可以使用它们的哈希值而不是字符串本身作为键来减少内存需求。表的创建在合理的时间内运行,但是,对结果对象进行序列化和反序列化存在问题:即使从String
移动到Integer
,我也遇到了内存不足错误。在我决定不存储a-b
和b-a
对之后,它似乎正在工作,但我可能在我的机器可以处理的边缘上保持平衡