繁体   English   中英

使用 mysql 加载数据 infile 处理大型 csv 文件

[英]Process large csv file using mysql load data infile

我正在尝试读取具有 500k 行和 81 列的 CSV 文件并将其插入到数据库中。 CSV 大小为 160 MB。 我必须每 3-4 小时处理一次。 每 3-4 小时,我就会有一个新的 CSV 文件,其中包含一些新记录和一些现有记录。 为此,我遵循了许多方法,但没有任何方法可以完美运行。

方法一:读取所有记录,但耗时过长。 读取20万条记录耗时1个多小时,然后超时。

$file    = fopen($path, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
}

作为解决方案:我可以增加php限制,执行时间和内存限制来避免这个错误,但我觉得它很慢。

方法二:

$query = "LOAD DATA LOCAL INFILE products.csv INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::select($query);

它给出了以下错误。

SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正确语法(SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY ' \\r\\n' 字段以 ',' 结尾,忽略 1 行)

方法三:

$query = "LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::connection()->getpdo()->exec($query);

或者

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl LINES TERMINATED BY '\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::connection()->getpdo()->exec($query);

出现以下错误

SQLSTATE[42000]:语法错误或访问冲突:1064 你的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正确语法

方法四

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";

DB::connection()->getpdo()->exec($query);

出现以下错误

PDO::exec(): MySQL 服务器已经消失

方法五

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";
DB::select($query);

出现以下错误

SQLSTATE[HY000]:一般错误:2014 无法执行查询,而其他无缓冲查询处于活动状态。 考虑使用 PDOStatement::fetchAll()。 或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。 (SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl)

我应该继续使用哪种方法,为什么会出现所有这些错误? 我想在更短的时间内处理所有记录而不会出现任何错误。

尝试添加这个: DB::connection()->disableQueryLog(); 到脚本的顶部 - 您的内存消耗可能来自在内存中存储查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM