我可以用Matlab的DB工具箱在36秒内导入200万行。如何在20分钟内导入600万行?
下面查询的最后一个提取步骤大约需要36秒。

q = 'select ... from mytable limit 2000000'; %notice 2 mil limit
result = exec(conn, q);
final_result = fetch(result);  % Takes about 36 seconds.

我的整个表有6097227行。但如果我这样做了:
q = 'select ... from mytable';
result = exec(conn, q);
final_result = fetch(result);

在最后的获取步骤中,MATLAB完全失去了它!CPU使用率约为500-600%(即使用了6/8个内核),而且需要一段时间。目前,随着它将在10万个批次,它最终完成了超过21分钟。
思想?怎么办?我真的很难理解这至少在行数上不是线性的。我有没有越过一些奇怪的极限?
顺便说一下:使用PostgreSQL驱动程序等,整个查询和导入到R的过程在R中大约需要43秒。。。和0摆弄。我可以用ODBC在类似的时间导入Stata。
注意:在上面的查询中...是10个左右的数值变量:一些整数,一些双精度。没有一个是文本。

最佳答案

这是为像这样的大型进口商品的总体战略提供建议。如果你使用的任何一个组件不能遵循它,那么你自然会有问题。
首先,根据记录的平均大小,成批导入1000到10000条记录。
第二,用一个多行插入每个批次:

INSERT INTO TABLE(columns...) VALUES (first-insert values), (second-insert values),...

也就是说,将每个批次的所有记录连接到一个多行插入中,并按此方式执行。它将极大地节省IO。

10-05 18:24
查看更多