2013-11-25 53 views
0

我想在mysql中導入一個巨大的txt。
這是我第一次嘗試使用php和mysql,所以我不確定問題出在哪裏。
我有一個接近400萬行的文本文件,我需要將它存儲在數據庫中。
我寫PHP的這個PICE做的工作:
超時導入mysql中的巨大txt

$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,但沒有任何更改。

+0

你通過命令行運行呢? – galchen

+0

不要這樣做。事實上,根本不要使用PHP。查看[MySQL Reference](http://dev.mysql.com/doc/refman/5.6/en/load-data.html)中的'LOAD DATA INFILE'。它會更快,更可靠地完成工作。 – 2013-11-25 22:57:12

+0

set_time_limit(0); – Jompper

回答

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)), 
    ...... 
; 
+0

問題是該文件是一個沒有分隔符的txt,但是帶有修復列:首先啓動一個0字符;第二個是4,第三個是8等(見子字符串變量)。一個ex行看起來像這樣:「001 001 1 1 1 001 001 1 06 1 1 2」 – danipen

+2

我明白了,然後首先修復CSV並在使用LOAD DATA後,速度會快很多倍。我保證是更好的方法。 – mcuadros

+0

如何將我的txt轉換爲可用的CSV格式?和如何使用加載數據? – danipen