我正在使用Spout读取超过 500.000 条记录的 Excel 文件(每列有 7 列,信息不多)。
问题是我的脚本超时了。我已经尝试上传这个限制并且它变得更好,但到目前为止我无法进行完整的插入,只有部分插入大约 50.000 行。
这不是我的选择。有什么方法可以拆分这个 Excel 文件,但在代码上?我看到的是即使文件没有插入数据库,操作文件也已经很慢并且超时。
所以……有什么建议吗?
谢谢!
您可以尝试set_time_limit()
重复调用,例如在插入的每一行之后。每次调用它都会重置时间限制。但是,如果您的服务器管理员设置了全局时间限制,则不允许您超过该时间限制。
但是在 MySQL 中将 50 万行一一插入到 InnoDB 表中本来就很慢,因为它需要在每一行之后进行自动提交。
如果您分批进行插入,您将获得很大的速度。例如,您现在可能正在做这样的事情:
INSERT INTO table (col1, col2, col3) VALUES (1, 'baker', 'charlie');
INSERT INTO table (col1, col2, col3) VALUES (2, 'delta', 'echo');
INSERT INTO table (col1, col2, col3) VALUES (3, 'foxtrot', 'golf');
INSERT INTO table (col1, col2, col3) VALUES (4, 'hotel', 'india');
INSERT INTO table (col1, col2, col3) VALUES (5, 'lima', 'mike');
而是这样做:
INSERT INTO table (col1, col2, col3) VALUES
(1, 'baker', 'charlie'),
(2, 'delta', 'echo'),
(3, 'foxtrot', 'golf'),
(4, 'hotel', 'india'),
(5, 'lima', 'mike');
这样,您将每五行而不是每行都在 MySQL 上产生提交开销。请注意,您可以将许多行放入单个 INSERT,而不仅仅是五个。MySQL 对查询长度的唯一限制可以通过SHOW VARIABLES LIKE 'max_allowed_packet';
.
当然,这对编程有点复杂,但速度要快得多。
无论如何,读取包含 3,500,000 个单元格的文件都不会很快。如果在功能强大的硬件上运行并且 Excel 文件使用内联字符串,则至少需要一分钟。
所以这里是你有的选项:
拆分文件可能有效,但需要提前完成(不在同一个脚本中,否则只会增加总处理时间的时间......)。
希望有帮助!
最好的方法是通过以下步骤在后台执行这项工作: