Hola todos:
En primer lugar me gustaría agradeceros la ayuda que prestáis en este foro, porque aunque es la primera vez que
posteo vengo leyéndoos desde hace tiempo.
Os cuento mi problema:
Estoy escribiendo un
script (en realidad ya está escrito) para detectar similaridades entre registros, para ello tengo que comparar la tabla dónde están estos registros consigo misma. En un principio probé a crear un producto cartesiano en la consulta SQL y funcionaba bien, pero cuando la tabla es muy grande produce millones de registros que no puedo procesar por cuestiones de memoria.
Lo siguiente que intenté es hacer dos consultas separadas, de forma que el
script compara cada registro de una consulta con todos los registros de la otra. Funciona a las mil maravillas, pero el problema es que es muy lento (se demora alrededor de 8 horas con 5000 registros).
Os pongo el código:
Usando Coloreado de perl
#!/usr/bin/perl
#Modulos utilizados:
use DBI;
use CONECTAR_ISI;
use TRIGRAM;
#Conectamos a la BBDD:
$dbh = Conectar->connect();
#Ejecutamos la primera consulta para extraer los campos a comparar
my $sth =
$dbh->prepare(
"SELECT id, autor, direccion, categoria, coautores, revistas,
vid, vautor, vdireccion, vcategoria, vcoautores, vrevistas
FROM autoridades2
WHERE `vautor` NOT LIKE '%duplicado%'
ORDER BY autor ASC
"
);
$sth->execute();
my $sth2 =
$dbh->prepare(
"SELECT id, autor, direccion, categoria, coautores, revistas,
vid, vautor, vdireccion, vcategoria, vcoautores, vrevistas
FROM autoridades2
WHERE `vautor` NOT LIKE '%duplicado%'
ORDER BY autor ASC
"
);
#Convierte la consulta en un array
while (@lineas = $sth->fetchrow_array ) {
#Por cada línea encontrada en la consulta ejecutamos la siguiente para hacer
#las comparaciones
$sth2->execute();
while ( @lineas2 = $sth2->fetchrow_array() ) {
#CODIGO PARA HACER COMPARACIONES
}
}
$sth->finish();
$sth2->finish();
$dbh->disconnect();
He probado a poner el "$dbh2->execute()" antes del primer "while" pero entonces me devuelve un error "DBD::mysql::st fetchrow_array failed: fetch() without execute()"
A ver si podéis echarme una mano, porque yo ya no sé qué hacer para optimizarlo...