J'ai un fichier csv avec des noms proches de la ligne 845k.Optimisation pour la comparaison d'éléments HashMap lors de l'écriture
Je souhaite comparer une chaîne de noms floue. J'ai utilisé l'implémentation Java fuzzy string matching de l'algorithme fuzzywuzzy de Python.
Mis en œuvre sous le code, il fonctionne parfaitement pour moi. Le problème est le temps de traitement à beaucoup. Chaque ligne de comparaison de temps dure près de 15 secondes avec les autres lignes. Ceci est 240 lignes pour une heure et tout le processus sera près de 6000 lignes. Et tout le processus sera fini en mois. Ceci est un temps de travail inacceptable.
J'ai besoin d'une technique ou d'une méthode d'optimisation. J'ai besoin de suggestion plutôt que de solution.
Que conseillez-vous pour le code ci-dessous?
BufferedReader br = new BufferedReader(new FileReader("data/names.csv"));
BufferedWriter bw = new BufferedWriter(new FileWriter("data/similars.csv"));
ConcurrentHashMap<Integer,String> map = new ConcurrentHashMap<Integer,String>();
String lines;
while((lines = br.readLine()) != null){
String[] line = lines.split("\\t",-1);
Integer nameId = Integer.parseInt(line[0]);
String name = line[1];
map.put(nameId, name);
}
for (Map.Entry<Integer, String> entry1 : map.entrySet()) {
Integer nameId1 = entry1.getKey();
String name1 = entry1.getValue();
for (Map.Entry<Integer, String> entry2 : map.entrySet()) {
Integer nameId2 = entry2.getKey();
if (nameId1 == nameId2) {
continue;
}
String name2 = entry2.getValue();
int ratio = FuzzySearch.ratio(name1,name2);
if(ratio > 95){
bw.write(nameId1 + "," + nameId2 + "\n");
}
}
// For to prevent matching same pairs again
map.remove(nameId1);
}
Que diriez-vous juste courir ceci sur plusieurs CPU ou plusieurs serveurs dans AWS? Si j'ai raison, cela devrait prendre environ 3 jours sur 24 cœurs: ((845000 * 15/2)/60/60/24)/24 ~ 3.05 jours. Je pense que c'est acceptable parce que vous devriez le faire une fois. –
@MaximDobryakov Il s'agit de mon pc de bureau avec i7 cpu et 16 gb ram.win 10 os. – Yilmazerhakan