我有一个任务,我需要解析一个非常大的文件并将结果写入 mysql 数据库。“非常大”意味着我们正在谈论 1.4GB 的 CSV 数据,总计约 1000 万行文本。
事情不是“如何”做,而是如何快速做。我的第一种方法是在没有任何速度优化的情况下在 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);
这显然没有以任何方式优化速度。有什么新开始的提示吗?我应该切换到另一种语言吗?