2016-03-31 13 views
0

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ı?

+0

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. –

+0

@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, –

+0

profiler profesörüne göre, yani uygulama demek istiyorum; İki elementin olduğu zaman bile uzman değil. –

cevap

0

Artık, dizelerimin kendileri için anahtarlar yerine, bellek gereksinimlerini azaltmak için anahtarlar yerine karmalarını kullanabilecek kadar benzersiz olduğunu fark ettikten sonra Guava'sTable<Integer, Integer, Double> kullanıyorum. Tablonun oluşturulması makul bir süre içinde çalışır, ancak ortaya çıkan nesnelerin serileştirilmesi ve serileştirilmesiyle ilgili sorunlar vardır: String ile Integer arasındaki geçişle bile bellek hatalarından kaçtım. Her iki a-b ve b-a çiftleri depolamaya karar verdikten sonra çalışıyor gibi görünüyor, ancak makinemin