2010-01-06 13 views
8

voglio inserire altri dati su 50.000 mysql per 'inserto' in mysql db, per questo ho 2 opzioni,Importa file di grandi dimensioni su DB MySQL

1- Direttamente importare il file (sql): seguito errore si verifica "Probabilmente hai tentato di caricare file troppo grandi. Consulta la documentazione per i modi per risolvere questo limite."

2- Utilizzare il codice php per inserire queste query in forma di diversi blocchi da (.sql) file. Ecco il mio codice:

<?php 

// Configure DB 
include "config.php"; 

// Get file data 
$file = file('country.txt'); 

// Set pointers & position variables 
$position = 0; 
$eof = 0; 

while ($eof < sizeof($file)) 
{ 
    for ($i = $position; $i < ($position + 2); $i++) 
    { 
     if ($i < sizeof($file)) 
     { 
      $flag = mysql_query($file[$i]); 

      if (isset($flag)) 
      { 
       echo "Insert Successfully<br />"; 
       $position++; 
      } 

      else 
      { 
       echo mysql_error() . "<br>\n"; 
      } 
     } 

     else 
     { 
      echo "<br />End of File"; 
      break; 
     } 
    } 

    $eof++; 
} 

?> 

Ma errore di formato di memoria è verificarsi però ho estendere il limite di memoria da 128M a 256M o addirittura 512M.

Quindi penso che se potessi essere in grado di caricare un file limitato da un file (.sql) come 1000 alla volta ed eseguire query mysql, potrebbe importare tutti i record da file a db. Ma qui non ho alcuna idea su come gestire la posizione di inizio del file alla fine e su come posso aggiornare la posizione iniziale e finale, in modo che non recuperi le righe recuperate in precedenza dal file .sql.

+0

avere riavviato i servizi e provare di nuovo su di cambiare il memory_limit – Treby

+0

Hai "si riferiscono [ed] alla documentazione per i modi per risolvere questo limite "? – Boldewyn

risposta

4

Ecco il codice che ti serve, ora ottimizzato! = D

<?php 

include('config.php'); 

$file = @fopen('country.txt', 'r'); 

if ($file) 
{ 
    while (!feof($file)) 
    { 
     $line = trim(fgets($file)); 
     $flag = mysql_query($line); 

     if (isset($flag)) 
     { 
      echo 'Insert Successfully<br />'; 
     } 

     else 
     { 
      echo mysql_error() . '<br/>'; 
     } 

     flush(); 
    } 

    fclose($file); 
} 

echo '<br />End of File'; 

?> 

Fondamentalmente si tratta di una versione meno avida del codice, invece di aprire l'intero file in memoria legge ed esegue piccoli pezzi (uno liners) di istruzioni SQL.

2

Invece di caricare l'intero file in memoria, che è ciò che è fatto quando si utilizza la funzione di file, una possibile soluzione potrebbe essere quella di leggerlo riga per riga, utilizzando un combinaison di fopen, fgets, e fclose - l'idea dell'essere per leggere solo ciò di cui hai bisogno, gestire le linee che hai e solo dopo, leggere le prossime due.


Additionnaly, si potrebbe desiderare di dare un'occhiata a questa risposta: Best practice: Import mySQL file in PHP; split queries

Non c'è una risposta accettata ancora, ma alcune delle risposte fornite potrebbe già aiutare ...

+0

Awww ... Stavo postando esattamente questo. : P –

+0

@Alix: hu ^^ c'è meno di 1 minuto tra le nostre due risposte: è il momento di scrivere un esempio ;-) –

0

Ho letto di recente sull'inserimento di molte query in un database in modo rapido. L'articolo suggeriva di utilizzare la funzione per ritardare alcuni secondi tra le query in modo da non sovraccaricare il server MySQL.

1

utilizzare il client a riga di comando, è molto più efficiente, e dovrebbero gestire facilmente 50K inserti:

mysql -uUser -p <db_name> < dump.sql 
Problemi correlati