Question

J'ai téléchargé une base de données qui a été exportée au format TXT et a environ 700 Mo avec 7 millions de disques (1 par ligne). J'ai fait un script pour importer les données dans une base de données MySQL, mais quand environ 4 millions de disques insérés dans, le navigateur se bloque. Je l'ai testé dans Firefox et IE. Quelqu'un peut-il me donner un avis et des conseils à ce sujet?

Le script est le suivant:

<?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);
?>
Était-ce utile?

La solution

Essayez diviser le fichier en morceaux de 100 MB. Ceci est une suggestion de résolution rapide pour faire le travail. La question du navigateur peut se compliquer à résoudre. Essayez aussi différents navigateurs.

phpMyadmin a des options pour continuer la requête si un accident est arrivé. Permet d'interruption de l'écriture dans le cas où l'importation détecte il est proche de limite de temps. Cela pourrait être un bon moyen d'importer des fichiers volumineux, mais il peut briser les transactions.

Autres conseils

Je ne sais pas pourquoi vous avez besoin d'un navigateur Web pour insérer des enregistrements dans MySQL. Pourquoi ne pas simplement utiliser les installations d'importation de la base de données elle-même et laisser le web sortir?

Si ce n'est pas possible, je me demande si les inserts Chunking en groupes de 1000 à un moment serait utile. Plutôt que de commettre la base de données entière comme une seule transaction, je vous recommande de le découper.

Utilisez-vous InnoDB?

  1. Ce que j'ai d'abord remarqué est que vous utilisez flush () unsafely. Faire flush () lorsque la mémoire tampon de httpd est plein résultat une erreur et votre script meurt. Abandonnez tout cela myflush () solution de contournement et utiliser un seul ob_implicit_flush() à la place.

  2. Vous n'avez pas besoin d'être le voir avec votre navigateur pour le faire fonctionner à la fin, vous pouvez placer un ignore_user_abort() si votre code doit terminer son travail, même si votre navigateur meurt.

  3. Je ne sais pas pourquoi votre navigateur est en train de mourir. Peut-être que votre script génère trop de contenu.

Essayez sans


Pause: nnnn

sortie au navigateur, et voir si cela aide. Il peut être simplement que le navigateur est étouffait sur la longue page web, il est demandé de rendre.

En outre, PHP est temps pendant long transfert?

Il ne suffit pas, que vous avez également le sommeil (10) ajouter au temps qu'il faut.

Vous pouvez diviser le fichier dans différents fichiers TXT, et refaire le processus en utilisant les fichiers. Je sais que je au moins utilisé cette approche une fois.

Le navigateur est étouffait parce que la demande prend trop de temps pour terminer. Y at-il une raison pour laquelle ce processus doit faire partie d'une page Web? Si vous devez absolument le faire de cette façon, envisager de scinder vos données en morceaux faciles à gérer.

Exécuter votre code dans la ligne de commande en utilisant PHP-CLI. De cette façon, vous ne rencontrerez jamais de temps pour long processus en cours d'exécution. Bien que, la situation est votre accident du navigateur avant que le temps-out ^^. Si vous essayez d'exécuter dans le serveur d'hébergement que vous ne disposez pas d'un accès shell, exécutez le code en utilisant crontab. Mais, vous devez vous assurer que la crontab ne fonctionnera une fois

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top