【发布时间】:2014-01-06 18:52:00
【问题描述】:
我需要运行一个每日 cron 作业,该作业迭代一个 6 MB 的 CSV 文件,以将大约 10,000 个条目中的每一个插入到 MySQL 表中。我编写的代码挂起并在一段时间后产生超时。
if (($handle = fopen($localCSV, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$dbdata = array(
'SiteID' => $siteID,
'TimeStamp' => $data[0],
'ProductID' => $data[1],
'CoordX' => $data[2],
'CoordY' => $data[3]
);
$row++;
$STH = $DBH->prepare("INSERT INTO temp_csv (SiteID,TimeStamp,ProductID,CoordX,CoordY) VALUES (:SiteID,:TimeStamp,:ProductID,:CoordX,:CoordY)");
$STH->execute($dbdata);
}
fclose($handle);
echo $row." rows inserted.";
}
最好使用mysql_* 函数而不是 PDO,因此我可以将这些值内爆到一个查询中(虽然很大),但不幸的是我需要遵守一些准则(要严格使用 PDO)。
我搜索了 SO 并且有非常相似的问题,但没有一个可以解决我的问题。我尝试的是以下内容:
1- 运行 LOAD DATA INFILE 和 LOAD DATA LOCAL INFILE 查询,但不断收到“找不到文件”错误,尽管该文件确实存在 777 权限。数据库服务器和共享主机帐户位于不同的环境中。我尝试了 csv 文件的相对路径和 url 路径,但没有运气(在这两种情况下都找不到该文件)。
2- 我将 csv 文件拆分为 2 个文件并在每个文件上运行脚本,以查看脚本挂起的阈值,但在每个文件的情况下,它在表中插入了两次条目。
我无权访问php.ini,因为它是一个共享主机帐户(云站点),只能通过 phpMyAdmin 访问MySQL。
我还能尝试什么来尽可能高效地完成此任务?
感谢任何帮助。
【问题讨论】:
-
我经常处理 .csv -> mysql,我的一般策略是每次插入多条记录,例如INSERT INTO table VALUES(一、二)、(三、四)、(五、六)等
-
批量插入会比每行插入一个更好。
-
谢谢@Dave,但是我怎么能在while循环中使用PDO呢?它可以与
mysql_*一起使用,但我不能使用它。 -
将
$DBH->prepare调用移出循环。