Pregunta

He descargado una base de datos que se exportan al formato TXT y tiene alrededor de 700 MB con 7 millones de discos (1) por línea. Hice un script para importar los datos a una base de datos MySQL, pero cuando alrededor de 4 millones de discos insertados en el navegador se bloquea. He probado en Firefox e IE. Alguien me puede dar una opinión y algunos consejos sobre esto?

La secuencia de comandos es la siguiente:

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
¿Fue útil?

Solución

Trate de dividir el archivo en trozos de 100 MB. Esta es una sugerencia solución rápida para hacer el trabajo. El problema del navegador puede ser complicado de resolver. Pruebe también diferentes navegadores.

phpMyadmin tiene la opción de continuar la consulta si un accidente que ocurrió. Permite la interrupción de las importaciones en caso de script detecta que está cerca de límite de tiempo. Esto podría ser una buena manera de importar archivos de gran tamaño, sin embargo, puede romper las transacciones.

Otros consejos

No estoy seguro de por qué necesita un navegador web para insertar registros en MySQL. Por qué no utilizar las facilidades de importación de la base de datos en sí y dejar la web fuera de él?

Si eso no es posible, me pregunto si los insertos de fragmentación en grupos de 1000 a la vez ayudaría. En lugar de comprometer a toda la base de datos como una sola transacción, me gustaría recomendar dividirlo.

¿Está utilizando InnoDB?

  1. Lo que he notado en primer lugar es que está utilizando flush () de manera insegura. Haciendo flush () cuando el buffer httpd es resultado completo en un error y muere su guión. Renunciar a todo esto myflush () solución y utilizar una sola vez ob_implicit_flush().

  2. No es necesario estar viendo con su navegador para que funcione hasta el final, se puede colocar un ignore_user_abort() lo que el código completará su trabajo, incluso si muere su navegador.

  3. No sé por qué el navegador se está muriendo. Tal vez la secuencia de comandos está generando demasiado contenido.

Inténtelo sin

Usa Pausa: nnnn

salida al navegador, y ver si eso ayuda. Puede ser simplemente que el navegador se está ahogando en la página web el tiempo que ha pedido que rendir.

Además, es PHP tiempo de espera durante la transferencia de tiempo?

No ayuda, también, de que tiene el sueño (10) añadiendo al tiempo que se tarda.

Usted puede tratar de dividir el archivo en diferentes archivos TXT, y rehacer el proceso utilizando los archivos. Sé que al menos acostumbrado que el enfoque de una vez.

El navegador está asfixiando porque la solicitud se tarda demasiado tiempo en completarse. ¿Hay alguna razón este proceso debe ser parte de una página web? Si es absolutamente necesario hacerlo de esta manera, considerar dividir sus datos en partes manejables.

Ejecutar el código en la línea de comandos usando PHP-CLI. De esta manera, nunca se encontrará con tiempo de espera para el proceso de larga duración. A pesar de que la situación es el bloqueo del navegador antes de tiempo de espera ^^. Si se intenta ejecutar en el servidor de alojamiento, que no tiene acceso a una consola, ejecute el código usando crontab. Sin embargo, usted tiene que asegurarse de que el crontab sólo se ejecutan una vez

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top