大文件解析并导入PHP MySQL

时间:2012-10-02 10:14:34

标签: php mysql database cakephp scalability

我有一个大的csv文件(大约700MB),我试图解析并插入到MySQL数据库中。我逐行读取csv(大约4x10 ^ 6行)并解析要插入的记录。然后,我将记录插入到数据库中,每批约10k条记录。解析期间有一些事情,例如使用11d 12:34:56将格式preg_match的持续时间转换为小时数。

preg_match('/(?P<days>\d+)d (?P<hours>\d+)?P<minutes>\d+)?P<seconds>\d+)/', $hoursUsed, $matches);

脚本大约需要40分钟才能完全解析文件并将所有记录插入数据库。我在这里的问题是: *预计什么时间?我想知道40分钟是否正常? *解析csv文件是否可以

我在PHP中解析大小约为700MB的文件(csv)(大约4x10 ^ 6行),但解析文件需要大约40分钟。我正在尝试优化解析,但只能在45到40分钟内优化它。我的问题是:

  • 应该期待什么时间?我想知道40分钟是否正常?
  • 我对请求执行此操作,因此在文件完全解析并插入所有内容之前没有响应。有没有更好的方法将其委托给异步进程?

仅供参考我正在使用CakePHP。

2 个答案:

答案 0 :(得分:2)

使用LOAD DATA INFILE会大大加快速度。只需在CHAR字段中加载持续时间值,让MySQL稍后处理它。

这样,您就可以将数据处理留给数据库,这将比PHP快得多。

此外,对于700MB和400万条记录,40分钟听起来并不算太糟糕。当然这一切都取决于代码,机器等。

答案 1 :(得分:0)

尽可能使用LOAD DATA INFILE命令。这很疯狂。 http://dev.mysql.com/doc/refman/5.1/en/load-data.html

您可以使用选项FIELDS TERMINATED BY ','LINES TERMINATED BY '\n'

构建CSV导入

您应该能够从PHP执行此类语句,但请注意,文件路径必须已满且可供MySQL访问。此外,如果您的mysql服务器位于PHP文件系统的另一台主机上,您可能需要一种解决方法。