2010-06-13 42 views
0

我從USDA's網站獲得這個大的(和奇怪格式的txt文件)。這是NUT_DATA.txt文件。將大分隔文件導入到MySQL表

但問題是,它幾乎是27MB!我成功導入了其他一些較小的文件,但我的方法是使用file_get_contents,這有助於在我試圖阻止27+ MB RAM時拋出錯誤。

那麼如何將這個龐大的文件導入到我的MySQL數據庫中而不會遇到超時和內存問題?我試過每次從文件中獲得一行,但是這會遇到超時問題。

使用PHP 5.2.0。

這裏是舊腳本(DB中的字段都只是數字,因爲我想不出什麼數字表示什麼營養,我發現這個數據非常糟糕的文檔很抱歉的代碼的醜陋。):

<? 

    $file = "NUT_DATA.txt"; 

    $data = split("\n", file_get_contents($file)); // split each line 

    $link = mysql_connect("localhost", "username", "password"); 
    mysql_select_db("database", $link); 

    for($i = 0, $e = sizeof($data); $i < $e; $i++) 
    { 
     $sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES("; 
     $row = split("\^", trim($data[$i])); // split each line by carrot 
     for ($j = 0, $k = sizeof($row); $j < $k; $j++) { 
      $val = trim($row[$j], '~'); 
      $val = (empty($val)) ? 0 : $val; 
      $sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s 
     } 
     $sql = rtrim($sql, ',') . ");"; 
     mysql_query($sql) or die(mysql_error()); // query the db 
    } 

    echo "Finished inserting data into database.\n"; 

    mysql_close($link); 

?> 
+0

我不知道PHP ,但我認爲如果你可以讀取幾行文字,那麼它可能會更好,然後將它們一次插入到數據庫中,然後讀取下一行文件直到EOF ... – Sunny 2010-06-13 02:23:37

+0

執行此操作的最佳方法是使用LOA D DATA(參見http://dev.mysql.com/doc/refman/5.1/en/load-data.html)當然這不是PHP,但它也不需要幾個小時來加載它。 – 2010-06-13 02:48:44

+0

感謝大家,但它是共享主機,我沒有完全訪問MySQL,也沒有任何其他腳本語言,除了PHP。 – Tom 2010-06-13 02:54:16

回答

2

如果你必須使用PHP,你可以使用fopenfgets

<? 

$file = "NUT_DATA.txt"; 
$fh = @fopen($file, "r"); // open the file for reading 
$link = mysql_connect("localhost", "username", "password"); 
mysql_select_db("database", $link); 

while(!feof($fh)) 
{ 
    $data = fgets($fh, 4096);  // read line from file 

    $sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES("; 
    $row = split("\^", trim($data)); // split each line by carrot 
    for ($j = 0, $k = sizeof($row); $j < $k; $j++) { 
     $val = trim($row[$j], '~'); 
     $val = (empty($val)) ? 0 : $val; 
     $sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s 
    } 
    $sql = rtrim($sql, ',') . ");"; 
    mysql_query($sql) or die(mysql_error()); // query the db 
} 

echo "Finished inserting data into database.\n"; 

fclose($fh); 

mysql_close($link); 

?> 

退房獲取更多信息與fgets documentation逐行讀取文件中的行

+0

使用這個,set_time_limit,並耐心等待,我設法將整個文件放到數據庫中。現在我只需要弄清楚這些數據是什麼:) – Tom 2010-06-13 03:08:46

0

可以增加內存的每個腳本可以通過設置在php.ini這個值使用量:

memory_limit = 64M 

說了:你使用PHP?其他腳本語言(如python)可能更適合這類任務。

+0

對於像這樣的任務,PHP很好! – mmattax 2010-06-13 02:18:26