超时在mysql中导入大文本

时间:2013-11-25 22:54:07

标签: php mysql mysqli timeout

我正在尝试在mysql中导入一个巨大的txt 这是我第一次尝试使用php和mysql,所以我不确定问题出在哪里 我有一个几乎400万行的txt,我需要将它存储在数据库中 我写了这个php的pice来完成这项工作:

$con=mysqli_connect('localhost', 'root', 'root', 'commuting');
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }


$handle = fopen("matrix_pendo2001.txt", "r") or die("Couldn't get handle");
if ($handle) {
    while (!feof($handle)) {

        $line = fgets($handle, 4096);

        $a = substr($line,0,3);
        $b = substr($line,4,3);
        $c = substr($line,8,1);
        $d = substr($line,10,1);
        $e = substr($line,12,1);
        $f = substr($line,14,3);
        $g = substr($line,18,3);
        $h = substr($line,22,3);
        $i = substr($line,26,1);
        $l = substr($line,28,2);
        $m = substr($line,31,1);
        $n = substr($line,33,1);
        $o = substr($line,35,8);

        $sql="INSERT INTO ita (ProvRes, ComRes, Sesso, Motivo, Luogo, ProvLav, ComLav, StatExt, MercPrev, Mezzo, Ora, Tempo, Num)
        VALUES 
        ('$a', '$b', '$c', '$d', '$e', '$f', '$g', '$h', '$i', '$l', '$m', '$n', '$o')";

        if (!mysqli_query($con,$sql))
          {
          die('Error: ' . mysqli_error($con));
          }
        echo "record '<b>" . $line . "'</b> added. <br/>";

    }
    fclose($handle);
}
mysqli_close($con); 

该脚本似乎运行良好,但我无法获得数据库中的所有行 在不到100万之后,脚本结束时没有明显的错误 我已将max_execution_time设置为0并将memory_limit增加到2048MB但没有任何变化。

1 个答案:

答案 0 :(得分:2)

我建议您使用LOAD DATA INFILE,这个SQL命令可以直接在服务器中执行,并且可以避免超时,因为在localhost中运行是最快的方法。

这是一个小例子:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';

基于这个问题:loading-fixed-width-space-delimited-txt-file-into-mysql您可以尝试这种可能的解决方案:

LOAD DATA LOCAL INFILE 
'/yourfile.txt' 
INTO TABLE clip
(@row)
SET a = TRIM(SUBSTR(@row,0,3)),
    b = TRIM(SUBSTR(@row,4,3)),
    c = TRIM(SUBSTR(@row,10,1)),
    ......
;