2010-07-16 5 views
2

J'essaie de lire 738627 enregistrements à partir d'un fichier plat dans MySQl. Le script semble fonctionner correctement, mais il me donne les erreurs de mémoire ci-dessus.Erreur de mémoire de mémoire de PHP, code pauvre ou augmente juste la limite de mémoire?

Un échantillon du fichier est:

#export_dategenre_idapplication_idis_primary 
#primaryKey:genre_idapplication_id 
#dbTypes:BIGINTINTEGERINTEGERBOOLEAN 
#exportMode:FULL 
127667880285760002817317350 
127667880285760002818261461 
127667880285760002825372301 
127667880285760002827785570 
127667880285760002827930241 
127667880285760002827987861 
127667880285760002828089791 
127667880285760002828168361 
127667880285760002828192041 
127667880285760002829144541 
127667880285760002829351511 

J'ai essayé d'augmenter la mémoire en utilisant permis

ini_set("memory_limit","80M"); 

et il échoue encore. Est-ce que je continue d'augmenter cela jusqu'à ce qu'il fonctionne?

Le code complet est

<?php 
    ini_set("memory_limit","80M"); 
    $db = mysql_connect("localhost", "uname", "pword"); 
    // test connection 
    if (!$db) { 
     echo "Couldn't make a connection!"; 
     exit; 
    } 
    // select database 
    if (!mysql_select_db("dbname",$db)) 

    { 
     echo "Couldn't select database!"; 
     exit; 
    } 
    mysql_set_charset('utf8',$db); 

    $delimiter = chr(1); 
    $eoldelimiter = chr(2) . "\n"; 
    $fp = fopen('genre_application','r'); 
    if (!$fp) {echo 'ERROR: Unable to open file.</table></body></html>'; exit;} 

$loop = 0; 
while (!feof($fp)) { 
    $loop++; 
    $line = stream_get_line($fp,128,$eoldelimiter); //use 2048 if very long lines 
if ($line[0] === '#') continue; //Skip lines that start with # 
    $field[$loop] = explode ($delimiter, $line); 
    $fp++; 
$export_date = $field[$loop][0]; 
$genre_id = $field[$loop][1]; 
$application_id = $field[$loop][2]; 

$query = "REPLACE into genre_apps 
(export_date, genre_id, application_id) 
VALUES ('$export_date','$genre_id','$application_id')"; 
print "SQL-Query: ".$query."<br>"; 
     if(mysql_query($query,$db)) 
     { 
      echo " OK !\n"; 
     } 
     else 
      { 
       echo "Error<br><br>"; 
       echo mysql_errno() . ":" . mysql_error() . "</font></center><br>\n"; 
      } 

    } 

    fclose($fp); 
    ?> 

Répondre

2

Votre boucle remplit la variable $field sans raison (il écrit dans une autre cellule à chaque itération de la boucle), en utilisant ainsi plus de mémoire à chaque ligne.

Vous pouvez remplacer:

$field[$loop] = explode ($delimiter, $line); 
$export_date = $field[$loop][0]; 
$genre_id = $field[$loop][1]; 
$application_id = $field[$loop][2]; 

Avec:

list($export_date, $genre_id, $application_id) = explode($delimiter, $line); 

Pour améliorer les performances, vous pourriez profiter de la possibilité d'insérer plusieurs lignes à l'aide REPLACE INTO en regroupant N lignes en une seule requête.

+0

merci, cela a laissé le script terminé :) – kitenski

Questions connexes