我有一個任務,我需要解析一個非常大的文件,並將結果寫入mysql數據庫。 「非常大」意味着我們正在討論約1.4GB的CSV數據,總計約1000萬行文本。解析一個非常大的文件到mysql
事情不是「怎麼做」,但如何做到這一點快。我的第一個方法是在沒有任何速度優化的情況下使用php,然後讓它運行幾天直到完成。不幸的是,它現在已經運行了48小時,並且只處理了總文件的2%。因此,這不是一種選擇。
文件格式如下:
A:1,2
其中逗號的量隔開的數字繼「:」可以是0-1000。該示例數據集必須進入一個表,如下所示:
| A | 1 |
| A | 2 |
所以現在,我沒有這樣說:
$fh = fopen("file.txt", "r");
$line = ""; // buffer for the data
$i = 0; // line counter
$start = time(); // benchmark
while($line = fgets($fh))
{
$i++;
echo "line " . $i . ": ";
//echo $i . ": " . $line . "<br>\n";
$line = explode(":", $line);
if(count($line) != 2 || !is_numeric(trim($line[0])))
{
echo "error: source id [" . trim($line[0]) . "]<br>\n";
continue;
}
$targets = explode(",", $line[1]);
echo "node " . $line[0] . " has " . count($targets) . " links<br>\n";
// insert links in link table
foreach($targets as $target)
{
if(!is_numeric(trim($target)))
{
echo "line " . $i . " has malformed target [" . trim($target) . "]<br>\n";
continue;
}
$sql = "INSERT INTO link (source_id, target_id) VALUES ('" . trim($line[0]) . "', '" . trim($target) . "')";
mysql_query($sql) or die("insert failed for SQL: ". mysql_error());
}
}
echo "<br>\n--<br>\n<br>\nseconds wasted: " . (time() - $start);
這顯然是不以任何方式速度進行了優化。任何提示重新開始?我應該換用另一種語言嗎?
第一我腦子裏的事情就是使用'MySQLi'或'PDO',這樣你就可以利用準備好的語句。 – Passerby
如果你的輸入數據是一個CSV文件,也許你可以使用LOAD DATA INFILE,更多信息:http://dev.mysql.com/doc/refman/5.0/en/load-data.html – m4t1t0