I am working on a project on Spring Boot and have to process a lot of information stored in Solr. I have to compare all my stored images with the entered by the user and establish a similitude. I used LinkedList of images at the beginning, now working with Arrays and LinkedList, but is also very slow and sometimes not working. I am talking about 11 000 000 images that I have to process. Here is my code:
public LinkedList<Imagen> comparar(Imagen[] lista, Imagen imagen) throws NullPointerException {
LinkedList<Imagen> resultado = new LinkedList<>();
for (int i = 0; i < lista.length; i++) {
if (lista[i].getFacesDetectedQuantity() == imagen.getFacesDetectedQuantity()) {
lista[i].setSimilitud(3);
}
if (herramientas.rangoHue(imagen.getPredominantColor_hue()).equals(herramientas.rangoHue(lista[i].getPredominantColor_hue()))) {
lista[i].setSimilitud(3);
}
if (lista[i].isTransparency() == imagen.isTransparency()) {
lista[i].setSimilitud(4);
}
if (analizar.compareFeature(herramientas.image64ToImage(lista[i].getLarge_thumbnail()), herramientas.image64ToImage(imagen.getLarge_thumbnail())) > 400) {
lista[i].setSimilitud(3);
}
if (analizar.compare_histogram(herramientas.image64ToImage(lista[i].getLarge_thumbnail()), herramientas.image64ToImage(imagen.getLarge_thumbnail())) > 90) {
lista[i].setSimilitud(3);
}
if (lista[i].getSimilitud() > 7) {
resultado.add(lista[i]);
}
}
return ordenarLista(resultado);
}
public LinkedList<Imagen> ordenarLista(LinkedList<Imagen> lista) {
LinkedList<Imagen> resultado = new LinkedList<>();
for (int y = 0; y < lista.size(); y++) {
Imagen imagen = lista.get(0);
int posicion = 0;
for (int x = 0; x < lista.size(); x++) {
if (lista.get(x).getSimilitud() > imagen.getSimilitud()) {
imagen = lista.get(x);
posicion = x;
}
}
resultado.add(imagen);
lista.remove(posicion);
}
return resultado;
}
Any idea of what data structure could I use to make the process faster. I also was thinking on make every comparative if
inside a thread but also not idea how to do that. A lot of googling and nothing found. Sorry for my English and Thanks!!!
I solved the problem of sorting with ordenarLista()
method just ignoring it and add this code on my comparar()
method before returning the list.
Collections.sort(resultado, new Comparator<Imagen>() {
@Override
public int compare(Imagen image1, Imagen image2) {
return image2.getSimilitud() - image1.getSimilitud();
}
});
Still working on my algorithm!