如何有效地使大型SQL查询到Matlab ?

15的观点(30天)
布莱恩
布莱恩 2015年10月27日
编辑: KAE 2021年4月7日
我有一个SQL表包含数据,我需要分析约6000万记录和字段。最好的办法是什么,到Matlab变量或一个变量。我有足够的RAM (64 gb),但我发现进口采取了很长一段时间,经常遇到错误。
  1. 最快的方法是将所有日期导入一个细胞?一个表吗?
  2. 用一个将允许“FetchInBatches”JVM设置为yes,以避免错误?
  3. 我应该循环部分的表和批量导入它呢?
  4. 我应该单独循环,做每个字段,这样我就可以下载到正确的数据类型吗?
提前感谢你的帮助,布莱恩

答案(1)

拉胡尔高尔
拉胡尔高尔 2015年10月29日
你好布莱恩,
它将帮助社区帮助你更好的如果你能分享更多的细节设置您正在使用。例如,数据库和司机,还位数:32或64位(在某些情况下)。
以下是一些观察与MySQL数据库使用JDBC驱动程序:
MySQL JDBC驱动程序在默认情况下检索完整的结果集,并将其存储在内存中。这可能导致的堆空间问题如果你正在与大的结果集的行数或大值不能JVM的堆空间分配所需的内存。
这个限制的解决方案之一是重建的SQL查询,包括“限制”和“抵消”结构。
限制条款来限制返回结果的数量在一个SQL语句。所以如果你在一个表中有1000行,但只想返回前10,你会这样做:
选择列于表
限制10
现在,假设你想要显示结果11日至20日。以抵消关键字一样简单,下面的查询将做的事:
从表选择列限制10抵消
使用下面的MATLAB代码使得使用这些SQL结构:
> >限制= <限制>;变化百分比限制选择有更好的响应时间
> >fetchCount = 1: N
康涅狄格州=数据库(例如,用户名,密码,姓名,值);
查询= [“select * from表> <”int2str(限制)“抵消”int2str ((fetchCount-1) *限制)];
卑鄙的人= exec(康涅狄格州、查询);
rowlimit = < row_limit >;变化百分比rowlimit选择有更好的响应时间
~ strcmp (curs.Data,没有数据的)
卑鄙的人=获取(杂种狗,rowlimit);
数据= curs.Data;
结束
关闭(康涅狄格州);
结束
从上面的代码在评论中提到的,请选择 限制 row_limit 这提供了更好的性能。的值限制和row_limit遵循钟形曲线的趋势,存在最优值,给出了更好的性能。例如,您可以使用10 ^ N的倍数取决于的行数。
希望这个有帮助。
1评论
KAE
KAE 2021年4月7日
编辑:KAE 2021年4月7日
查询应
查询= [“SELECT * from <表>上限”int2str(限制)“抵消”int2str ((fetchCount-1) *限制)];
WHERE子句添加?

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!