Pergunta

Eu baixei um banco de dados que foi exportado para o formato TXT e tem cerca de 700 MB com 7 milhões de discos (1 por linha). Fiz um script para importar os dados para um banco de dados mysql, mas quando cerca de 4 milhões de discos inserido, o navegador trava. Eu testei no Firefox e IE. Alguém pode me dar uma opinião e alguns conselhos sobre isso?

O roteiro é o seguinte:

<?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);
?>
Foi útil?

Solução

Tente rachar o arquivo em 100 MB pedaços. Esta é uma sugestão solução rápida para começar o trabalho feito. O problema com o navegador pode ser complicado de resolver. Tentar também diferentes browsers.

phpMyadmin tem opções para continuar a consulta se um acidente aconteceu. Permite interrupção da importação na detecta scripts caso, está perto de limite de tempo. Isso pode ser bom caminho para importar arquivos grandes, no entanto, ele pode quebrar transações.

Outras dicas

Eu não sei por que você precisa de um navegador web para inserir registros em mysql. Porque não basta usar as facilidades de importação do próprio banco de dados e deixar a web com isso?

Se isso não for possível, eu me pergunto se chunking as inserções em grupos de mil de cada vez ajudaria. Ao invés de cometer todo o banco de dados como uma única transação, eu recomendo dividindo-o.

Você está usando InnoDB?

  1. O que eu tenho notado pela primeira vez é que você está usando flush () insegura. Fazendo flush () quando o httpd tampão é resultado completo em um erro e suas matrizes de script. Desistir de toda a solução deste myflush () e usar um único ob_implicit_flush() vez.

  2. Você não precisa ser vê-lo com seu navegador para fazê-lo funcionar até o fim, você pode colocar um ignore_user_abort() para que o seu código deve completar seu trabalho, mesmo que morre seu navegador.

  3. Não sei por que o seu browser está morrendo. Talvez seu script está gerando muito conteúdo.

Experimente sem


Pausa: nnnn

saída para o navegador e ver se isso ajuda. Pode ser simplesmente que o navegador está engasgada na página web tempo ele pediu para processar.

Além disso, é PHP tempo limite durante a longa transferência?

Ele não ajudar, também, que você tem sono (10) somando-se o tempo que leva.

Você pode tentar dividir o arquivo em diferentes arquivos TXT, e refazer o processo usando os arquivos. Eu sei que pelo menos usado essa abordagem uma vez.

O navegador está engasgada porque o pedido está demorando muito para ser concluído. Existe uma razão para este processo deve ser parte de uma página web? Se você absolutamente tem que fazê-lo desta maneira, considere dividir seus dados em partes gerenciáveis.

Executar o seu código na linha de comando usando PHP-CLI. Dessa forma, você nunca vai encontrar tempo limite para o processo de longa duração. Embora, a situação é acidente de seu navegador antes de tempo limite ^^. Se você tentar executar no servidor de hospedagem que você não tem acesso shell, execute o código usando crontab. Mas, você tem que ter certeza que o crontab só correr uma vez !

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top