我需要重复运行大型查询并在Matlab中存储/操作结果。我使用Connector / J(mysql-connector-java-5.1.25驱动程序)连接到mySQL服务器(位于我的本地机器上)。我运行的查询创建了一个带有数据的~140 MB单元数组(我已经在本文的底部包含了查询代码和表的CREATE
代码)。执行此查询并创建单元阵列大约需要10秒钟。在HeidiSQL中运行相同的查询并显示所有结果只需0.2秒。
当我在Matlab中运行一个简单的select count(*) from (<current query>)
时(即,当我不创建单元数组来存储查询结果时),这些语句只需要0.3秒就可以执行,所以我被引导相信Matlab中经历的显着时间增长与将如此多的数据写入单元阵列有关。
有没有办法在Matlab中加快这个过程?
我的代码:
我在mySQL中有以下表格(CREATE
代码取自HeidiSQL;一些字段名称已更改):
CREATE TABLE `data` (
`PRIMARY` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ID` VARCHAR(5) NULL DEFAULT NULL,
`DATE` DATE NULL DEFAULT NULL,
`PRICE` DECIMAL(14,4) NULL DEFAULT NULL,
`QUANT` INT(10) NULL DEFAULT NULL,
`TIME` TIME NULL DEFAULT NULL,
INDEX `DATE` (`DATE`),
INDEX `ID` (`SYMBOL`),
INDEX `PRICE` (`PRICE`),
INDEX `QUANT` (`SIZE`),
INDEX `TIME` (`TIME`),
PRIMARY KEY (`PRIMARY`)
)
它填充了大约360,000行数据。
我正在运行的查询是:
Select ID, DATE, PRICE, QUANT, TIME FROM database.data WHERE DATE
>= "2007-01-01" AND DATE <= "2010-12-31" ORDER BY ID, DATE, TIME ASC;
这将返回约260,000行。顺便说一句,删除ORDER BY
语句不会加快查询速度。
在Matlab中,我使用以下代码执行查询并存储结果:
MyCellArray = fetch(dbConn, IntradayQUERY);
其中dcConn
是数据库连接对象,IntradayQUERY
是包含查询语句的字符串。
答案 0 :(得分:0)
尝试增加fetch
函数中的行增量。这减少了Matlab从结果中提取数据的次数,并减少了所需的内存重新分配量。默认值是1280.我会更大,更大,直到您的计算机内存不足。尝试10,000,100,000甚至500,000。如果您开始耗尽内存,请考虑选择较少的列(当然,您的应用程序允许)。
例如,将MyCellArray = fetch(dbConn, IntradayQUERY);
替换为MyCellArray = fetch(dbConn, IntradayQUERY, 100000);
,看看会发生什么。