2012-01-11 76 views
0

我想导入巨大的.csv文件到数据库中。它是Drupal数据库,我将产品导入节点,content_type_和uc_products表。但是这并不是因为我停止使用Drupal函数node_load和/或node_save来优化性能,而是直接通过SQL命令插入/更新记录。PHP .csv(44k记录)导入到MySQL数据库崩溃与代理错误

方案:从本地服务器(大约40MB)

  1. 阅读整个csv文件到 变量(以防止访问每每条记录的文件)
  2. 它解析到每行
  3. 阵列
  4. 解析每行到字段

  5. 检查数据库中的记录是否存在(1 SQL select,比较特定字段)

  6. 如果存在,更新(1个SQL更新)
  7. 如果不存在,将其插入(3个插入,1次更新)

    6.1。如果记录有图像代码并且与数据库中的图像代码不同,请从外部服务器下载(卷曲)新图像文件并将其保存在本地服务器上。

  8. 1个额外的延迟插入到日志表

当我运行该脚本,我得到502代理错误(原因:错误从远程服务器上读取)约后。 10K导入的记录和页面停止加载。但是,导入仍在继续(新记录仍被添加到表中)。这会在20k-26k(尝试多次)记录后停止。

两个问题: 什么是代理错误,为什么我会得到一个? 如何优化我的脚本甚至更多?是否有其他常用的方法将大量数据导入到MySQL中?

非常感谢。

+0

可能重复的[导入工具Excel CSV](http://stackoverflow.com/questions/2262343/import-tool-excel-csv) – Gordon 2012-01-11 14:10:26

+1

对于SQL的东西,我不得不在2天前做类似的事情 - 来自CSV文件的超过600,000条记录。我所做的是编写一个脚本来将CSV转换为INSERT语句(在你的情况下,你可以使用条件插入或使用WHERE子句或EXISTS)。我结束了一个47m的SQL文本文件,然后使用'mysql -uuser -ppass dbname 2012-01-11 14:17:59

回答

0

这听起来像你和PHP代码之间的代理服务器(很可能是服务器上的反向代理,如果这是你的设置)被放弃在等待以获得脚本的响应。

虽然您可能可以调整这些超时,但我个人会尝试从http生命周期中解耦非常长的操作。不是一个PHP开发人员,所以不知道常见的方法是什么。