Yaklaşık 30000 X 30000 boyutunda, dizeler arasındaki mesafeleri içeren yoğun bir simetrik matrisim var. Bu uzaklık simetrik olduğu için verilen için, matrisin üst üçgen şeklinde çabuk mesafeleri aramak için bir harita oluşturmak için HashMap
ve org.javatuples.Pair
kullanıyorumorg.javatuples.Pair ve HashMap öğelerini kullanarak yoğun matris oluşturmak çok yavaş
stringA<tab>stringB<tab>distance
bir sekme ayrılmış 3-kolon dosya içinde saklanır dizesinin çiftleri şöyle:
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
çok büyük (~ 400M hatları) ve süreç sonunda en zamanla aşağı tarama yavaşlatır java.util.HashMap.put
harcanmaktadır.
(m) çiftlerde herhangi bir karma kod çakışma olması gerektiğini düşünmüyorum ama yanılıyor olabilirim. Bunu nasıl doğrulayabilirim? Sadece p12.hashCode()
ve p12.hashCode()
'un ne kadar benzersiz olduğuna bakmak yeterli mi?
Herhangi bir çarpışma yoksa, yavaşlama neden başka ne olabilir?
Hızlı arama için bu matrisi oluşturmak için bir yol var mı?
Glancing'i işleyebildiğinin kenarında dengeleme yapıyor olabilir, 'hashCode()' uygulaması dürüst görünüyor oldukça kötü. Muhtemelen, kendi çiftinizi yazmanız daha iyi olur. Ayrıca, 'String.split' kullanmak yerine manuel' split' yapmak. –
@LouisWasserman "org.javatuples.Pair" deki "hashCode" uygulamasını kastediyor musunuz? Ve 'split' önerisi için teşekkürler, şimdi sadece işleme saatinin% 0,5'ine tekabül etmesine rağmen, –
profiler profesörüne göre, yani uygulama demek istiyorum; İki elementin olduğu zaman bile uzman değil. –