5

我有一个大的 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。

4

2 回答 2

2

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

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

此外,对于 700MB 和 400 万条记录来说,40 分钟听起来还不错。当然,这一切都取决于代码、机器等。

于 2012-10-02T10:22:32.527 回答
0

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

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

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

于 2012-10-02T10:24:41.343 回答