非常に大きなファイルを解析し、その結果をmysqlデータベースに書き込む必要があるタスクがあります。「非常に大きい」とは、1.4GBのCSVデータ、合計で約1,000万行のテキストについて話していることを意味します。
物事はそれを行うための「方法」ではなく、それを速く行う方法です。私の最初のアプローチは、速度を最適化せずに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);
これは明らかに速度に対して最適化されていません。新たなスタートのヒントはありますか?別の言語に切り替える必要がありますか?