使用PHP在MySQL中导入CSV
我正在尝试在MySQL数据库中导入巨大的csv(>1Gb)文件:使用PHP在MySQL中导入CSV,php,mysql,symfony,csv,import,Php,Mysql,Symfony,Csv,Import,我正在尝试在MySQL数据库中导入巨大的csv(>1Gb)文件: /** * @param $file_path */ private function importFileContents($file_path) { $query = sprintf("LOAD DATA LOCAL INFILE '%s' INTO TABLE file_import_contents FIELDS
/**
* @param $file_path
*/
private function importFileContents($file_path)
{
$query = sprintf("LOAD DATA LOCAL INFILE '%s'
INTO TABLE file_import_contents
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\\n'
IGNORE 1 LINES
(@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12, @col13, @col14, @col15, @col16, @col17, @col18, @col19, @col20, @col21)
set add_params=@col1, available=@col2, category_id=@col3, currency_id=@col4, delivery=@col5, description=@col6, model=@col8, modified_time=@col9, name=@col10, oldprice=@col11, param=@col12, pickup=@col13, picture=@col14, price=@col15, sales_notes=@col16, type=@col17, type_prefix=@col18, url=@col19, vendor=@col20, vendor_code=@col21
", addslashes($file_path));
$em = $this->getContainer()->get('doctrine.orm.default_entity_manager');
$connection = $em->getConnection();
$statement = $connection->prepare($query);
$statement->execute();
}
问题是导入后在db中执行sql计数时:
SELECT COUNT(*) FROM file_import_contents;
它返回我1 648 990行,但当我在终端中运行命令以计算所有csv文件中的行时:
find ./ -type f -name "*csv*" -exec wc -w {} +
它返回总行数76319426。。。
我的php参数是:upload\u max\u filesize=3200m
最大执行时间=300000
最大输入时间=600000
内存限制=1024M
…并在脚本中:
ini_集('memory_limit','-1')代码>
为什么会发生这种情况?我怎样才能完全上传这些文件?感谢您的建议在解析CSV文件并将其注入数据库时,您运行查询的服务器可能无法提供足够的内存来保存CSV文件。因此,无论您如何尝试配置设置,它都将始终失败
<>我会考虑将CSV划分成更小的块,并且我也会检查以确保导入的数据不失真,以防脚本没有正确读取行尾。< /P> < P> OK,它正在工作。计算终端中的行时出错:
find ./ -type f -name "*csv*" -exec wc -w {} +
相反-w必须是-l
find ./ -type f -name "*csv*" -exec wc -l {} +
结果localhost在102秒内运行了200万行
可以逐行执行,使用SplFileObject和fgetcsv()读取每一行,然后插入。这意味着您可以一次处理一条记录中的无用数据。这将是缓慢的,但它应该工作。我已经尝试了导入与联赛\Csv\Reader行行,但它的良好工作与文件只有约30-50Mb,但如果文件是1Gb-导入大约需要几个小时