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:
Using perl Syntax Highlighting
#!/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();
#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();
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
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...