У меня есть файл csv с именами почти 845k строк.Оптимизация для сравнения элементов HashMap во время итерации
Я хочу сравнить нечеткое имя строки соответствия. Я использовал Java fuzzy string matching реализацию известного алгоритма fuzzywuzzy Python.
Реализованный ниже код работает отлично для меня. Проблема - это время для процесса. Каждое время сравнения строк составляет около 15 секунд с другими линиями. Это 240 строк в течение часа, и весь процесс будет около 6000 строк. И весь процесс будет завершен через несколько месяцев. Это неприемлемое рабочее время.
Мне нужна техника или метод оптимизации. Мне нужно некоторое предложение, а не решение.
Что вы предлагаете для нижнего кода?
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);
}
Как просто запустить это на нескольких процессорах или нескольких серверах в AWS? Если я прав, это займет около 3 дней на 24 ядрах: ((845000 * 15/2)/60/60/24)/24 ~ 3.05 дней. Я думаю, что это приемлемо, потому что вы должны сделать это один раз. –
@MaximDobryakov İt - мой настольный компьютер с i7 cpu и 16 gb ram.win 10 os. – Yilmazerhakan