2011-09-28 22 views
5

Quiero cargar un archivo csv grande aproximadamente 10,000,000 registros en la tabla mysql que también contienen el mismo número o más. de registros y también algunos registros duplicados. Intenté el archivo de datos locales, pero también me está llevando más tiempo. ¿Cómo puedo resolver esto sin esperar mucho tiempo? Si no se puede resolver, ¿cómo puedo hacerlo con AJAX para enviar algunos registros y procesarlos a la vez y lo haré hasta que se cargue/procese todo el csv?Cargar archivo CSV grande aproximadamente 10,000,000 registros en la tabla mysql también contiene filas duplicadas

+2

Vas a tener que explicar por primera vez esta nueva notación número al que he llegado con. – mowwwalker

+0

¿Son mil millones de registros o 10 millones? – webbiedave

+2

a través de ajax sería aún más lento. si desea que los comandos de cargar carga no tarden tanto, divida la csv en trozos más pequeños. –

Respuesta

0

Prueba esto:

load data local infile '/yourcsvfile.csv' into table yourtable fields terminated by ',' lines terminated by '\r\n' 
+0

OP ha dicho que ha intentado 'load infile' y es demasiado lento. ¿Cómo cambia esto algo? –

+0

Ya lo intenté ... – akashdeep

+0

ups, perdón! El problema de no leer bien:/ – hunt

6

LOAD DATA INFILE no va a ser vencido velocidad se refiere. Hay algunas cosas que puede hacer para acelerarlo:

  • eliminar o inhabilitar algunos índices (pero, por supuesto, que llegaremos a esperar a que se construyan después de la carga, pero esto es a menudo más rápido.). Si está utilizando MyISAM, puede ALTER TABLE *foo* DISABLE KEYS, pero InnoDB no lo admite, desafortunadamente. Tendrás que dejarlos en su lugar.
  • Optimice su configuración my.cnf. En particular, es posible que pueda desactivar muchas cosas de seguridad (como fsync). Por supuesto, si sufre un bloqueo, tendrá que restaurar una copia de seguridad y volver a iniciar la carga. Además, si está ejecutando el my.cnf predeterminado, la última vez que lo revisé es bastante subóptimo para una máquina de base de datos. Hay muchas guías de afinación disponibles.
  • Compre un hardware más rápido. O alquila algunos (por ejemplo, prueba una instancia rápida de Amazon ECC).
  • Como menciona @ZendDevel, considere otras soluciones de almacenamiento de datos, si no está bloqueado en MySQL. Por ejemplo, si solo está almacenando una lista de números de teléfono (y algunos datos con ellos), una tabla simple de hash será mucho más rápida.

Si el problema es que está matando el rendimiento de una base de datos, puede dividir su archivo CSV en varios archivos CSV y cargarlos en fragmentos.

+0

En realidad, estoy lidiando con la solución de lista blanca para números móviles en un centro de llamadas, y tengo que cargar esta cantidad de datos todos los días (hay filas duplicadas). – akashdeep

+0

@ user969923: Parece que tienes que combinar la optimización de my.cnf si aún no se ha hecho y comprar hardware más rápido. La gente de Serverfault probablemente pueda ayudarlo más con detalles. – derobert

+0

¿Cómo puedo hacer con HASH TABLE. Tengo solo 5 campos y solo uno es clave principal (número de teléfono móvil). Dame un ejemplo. – akashdeep

0

Según su motor de almacenamiento, esto puede llevar mucho tiempo. Me di cuenta de que con MYISAM va un poco más rápido. Acabo de probar con el mismo conjunto de datos y finalmente fui con PostgreSQL porque era más robusto al cargar el archivo. Innodb fue tan lento que lo aborté después de dos horas con el mismo tamaño de datos, pero era de 10,000,000 de registros por 128 columnas llenas de datos.

0

Como esta es una lista blanca que se actualiza a diario, ¿no significa que hay una gran cantidad de duplicados (después del primer día)? Si este es el caso, haría la carga mucho más rápida para hacer un script simple que verifica si el registro ya existe antes de insertarlo.

0

Intentar esta consulta:

$sql="LOAD DATA LOCAL INFILE '../upload/csvfile.csv' 
INTO TABLE table_name FIELDS 
TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' " 
Cuestiones relacionadas