- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用MATLAB调用的JDBC访问PostGreSQL 8.4数据库。
我感兴趣的表基本上由不同数据类型的各种列组成。通过时间戳选择它们。
由于我想检索大量数据,因此我正在寻找一种使请求比现在更快的方法。
我目前正在做的事情如下:
首先,我建立与数据库的连接,并将其称为DBConn
。下一步将是准备一个Select-Statement并执行它:
QUERYSTRING = ['SELECT * FROM ' TABLENAME '...
WHERE ts BETWEEN ''' TIMESTART ''' AND ''' TIMEEND ''''];
QUERY = DBConn.prepareStatement(QUERYSTRING);
RESULTSET = QUERY.executeQuery();
FLOAT
为1,对于
BOOLEAN
为-1,其余为0-几乎所有列都包含
FLOAT
)。下一步是逐行处理每一行,并通过相应的方法检索数据。
FNAMES
包含表的字段名称。
m=0; % Variable containing rownumber
while RESULTSET.next()
m = m+1;
for n = 1:length(FNAMES)
if COLTYPE(n)==1 % Columntype is a FLOAT
DATA{1}.(FNAMES{n})(m,1) = RESULTSET.getDouble(n);
elseif COLTYPE(n)==-1 % Columntype is a BOOLEAN
DATA{1}.(FNAMES{n})(m,1) = RESULTSET.getBoolean(n);
else
DATA{1}.(FNAMES{n}){m,1} = char(RESULTSET.getString(n));
end
end
end
最佳答案
摘要
为了加快速度,请使用“数据库工具箱”或自定义Java代码将循环以及您的列数据类型转换向下推送到Java层。 Matlab到Java的方法调用开销可能是杀死您的原因,并且无法使用纯JDBC进行块获取(一次调用中有多行)。确保所使用的JDBC驱动程序上的旋钮设置正确。然后优化昂贵的列数据类型(如字符串和日期)的传输。
(注意:我尚未使用Postgres进行此操作,但已使用其他DBMS进行此操作,这也将适用于Postgres,因为其中大部分与它上面的JDBC和Matlab层有关。)
细节
推送循环到Java以获取块
最快速的方法是将行和列上的循环向下推送到Java层,并使它将数据块(例如一次100或1000行)返回到Matlab层。从Matlab调用Java方法会产生大量的每次调用开销,并且会在M代码中循环JDBC调用(请参阅Is MATLAB OOP slow or am I doing something wrong?-完全公开:这就是我的答案)。如果要像这样从M代码调用JDBC,则会在每一行的每一列上产生开销,这可能是目前执行时间的大部分。
JDBC API本身不像ODBC那样支持“块游标”,因此您需要将该循环深入到Java层。像Oleg建议的那样使用数据库工具箱是一种实现方法,因为它们在Java中实现了较低级的游标。 (可能正是出于这个原因。)但是,如果您没有数据库工具箱的依赖关系,则可以编写自己的瘦Java层,然后从M代码中调用它。 (可能通过与您的自定义Java代码耦合的Matlab类,并且知道如何与之交互。)使Java代码和Matlab代码共享一个块大小,使用原始数组而不是在Java端缓冲整个块尽可能使用列缓冲区的对象数组,并让您的M代码分批提取结果集,将这些块缓冲在原始列数组的单元格数组中,然后将它们串联在一起。
Matlab层的伪代码:
colBufs = repmat( {{}}, [1 nCols] );
while (cursor.hasMore())
cursor.fetchBlock();
for iCol = 1:nCols
colBufs{iCol}{end+1} = cursor.getBlock(iCol); % should come back as primitive
end
end
for iCol = 1:nCols
colResults{iCol} = cat(2, colBufs{iCol}{:});
end
datenum
(随着Java加倍,带有列类型指示符),从而将日期解析向下推送到Java中,也许使用缓存来避免重新计算重复日期。同一套。 (请注意
TimeZone
问题。请考虑使用Joda-Time。)在Java端将所有
BigDecimal
转换为
double
。而且,cellstr是一个很大的瓶颈-单个char列可能会淹没几个float列的成本。如果可以(返回大Java
char[]
然后使用
reshape()
),则返回窄的CHAR列作为2-d字符而不是cellstrs,并在必要时在Matlab端转换为
cellstr
。 (将Java
String[]
转换为
cellstr
的效率较低。)并且您可以通过将低基数字符列作为“符号”传递回去来优化对低基数字符列的检索-在Java方面,建立唯一字符串列表值并将其映射为数字代码,然后将字符串作为数字代码的原始数组以及该数字映射-> string返回;在Matlab端将不同的字符串转换为cellstr,然后使用索引将其扩展为完整数组。这将更快,并为您节省大量内存,因为写时复制优化将为重复的字符串值重用相同的原始char数据。或将它们转换为
categorical
或
ordinal
对象,而不是cellstrs(如果适用)。如果您使用大量字符数据并具有较大的结果集,则此符号优化可能会是一个大赢家,因为这样一来,您的字符串列将以大约原始数字的速度传输,这实际上要快得多,并且可以减少cellstr的典型内存碎片。 (数据库工具箱现在也可能支持其中一些功能。我已经有两年没有实际使用它了。)
BINARY_DOUBLE
可能比正常的
NUMERIC
快一点。 YMMV。
obj.method(...)
更改为
method(obj, ...)
来提高速度。例如。
getDouble(RESULTSET, n)
。这只是一个奇怪的Matlab OOP怪癖。但这并不会有太大的成功,因为您仍然需要为每次调用支付Java / Matlab数据转换的费用。
?
占位符和绑定参数,而不是将字符串作为SQL文字插入。如果您正在执行自定义Java层,则定义自己的@connection和@preparedstatement M代码类是一种不错的方法。所以看起来像这样。
QUERYSTRING = ['SELECT * FROM ' TABLENAME ' WHERE ts BETWEEN ? AND ?'];
query = conn.prepare(QUERYSTRING);
rslt = query.exec(startTime, endTime);
关于sql - 如何使用MATLAB和JDBC加快表检索的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23244179/
我想使用 ffmpeg 框架更改视频速度。我为此使用了这个命令: ffmpeg -y -i /storage/extSdCard/Video/1.avi -filter_complex [0:v]fp
我有以下数据数组,有 200 万个条目: [20965 1239 296 231 -1 -1 20976 1239 299 314 147 337 255
我正在使用 Oracle 数据库,并且想获取一个包含 3000 万条记录的表。 library(RODBC) ch <- odbcConnect("test", uid="test_user",
我在 android 上使用 FFmpeg 来: 1- 合并 3 个视频 2-添加音频 3-添加标志 4-修剪 3 个视频之一 5-改变输出的fps 我已经实现了正确的代码,但花了 30 分钟。对于(
我使用 GLPKMathProgInterface 和 JuMP 编写了一个程序来解决 Julia 中的线性程序。 Julia 代码由 python 程序调用,该程序通过多个命令行调用运行多个 Jui
我们使用 POV-Ray 每次运行生成大约 80 张图像,我们将这些图像拼接在一起形成两个移动的 GIF 文件(一个场景的两个 360 度 View )。我们正在寻找尽可能加快此镜像创建的方法(在 h
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我将数据从一个数据库插入到另一个数据库,所以我有 2 个连接(Conn1 和 Conn2)。下面是代码(使用pypyodbc)。 import pypyodbc Conn1_Query = "SE
在我的应用程序中,我显示 EKEvents 列表,我想在 UITableView 中显示一个月的所有事件,每个部分包含各自的日期。嗯,这可行,我得到了我需要的所有数据,但获取速度非常慢。 问题在于事件
我有一个移动速度非常慢的传送带。我不知道什么JS脚本控制速度,我需要它来加速。无法从主题制作者那里获得任何帮助。任何建议都会非常有帮助。谢谢 页面: http://krankgolf2017.wpen
有没有办法加快这段代码的速度?我需要它来删除相同的内容并将其写入单元格,以强制其他 VBA 代码运行另一列上的代码。这就是它的作用,只是 super 慢。有时此表上有 2000 个条目/行。每个单元大
我正在开发一个相当大的程序,它再次从一个相当大的 Excel 电子表格中获取数据。由于一些奇怪的原因,加载这个大的 Excel 文件需要很长时间,我希望能以某种方式加快速度。我做了自己的研究并尝试了
我有下面的代码,将所有按钮(有 10 个)着色为灰色,以清除任何先前着色的按钮,然后将所选按钮着色为蓝色。基本上充当当前选择哪个按钮的指示器。我注意到代码现在需要一些时间才能通过这种修饰添加来运行,我
我有一个 LINQ 查询,它正在搜索包含大约 250,000 条记录的 SQL 表,并且仅搜索 2 个字段。这两个字段都已建立索引,但我发现它的运行速度仍然相当慢。 下面是代码,有人可以提出任何建议来
对于相对较大的 Pandas DataFrame(几十万行),我想创建一个应用函数结果的系列。问题是该功能不是很快,我希望它能以某种方式加快速度。 df = pd.DataFrame({ 'valu
这个问题在这里已经有了答案: Faster weighted sampling without replacement (3 个答案) 关闭 9 年前。 如何在 R 中加快概率加权采样。 # Let
在运行 PhantomJS 提供的 rasterize.js 示例时,我发现我必须等待 20 秒或更长时间才能生成网页图像。 有没有可能在不消耗大量资源的情况下加快速度的方法?我基本上希望快速生成从加
我正在开发一个相当大的程序,它再次从一个相当大的 Excel 电子表格中获取数据。由于一些奇怪的原因,加载这个大的 Excel 文件需要很长时间,我希望能以某种方式加快速度。我做了自己的研究并尝试了
我有下面的代码,将所有按钮(有 10 个)着色为灰色,以清除任何先前着色的按钮,然后将所选按钮着色为蓝色。基本上充当当前选择哪个按钮的指示器。我注意到代码现在需要一些时间才能通过这种修饰添加来运行,我
我有一个 Excel 工作簿,用户通过单击按钮导入文本文件。我的代码完全按照我的需要工作,但是在填写 H 列“阅读日期”时速度非常慢。将文本文件导入 Excel 工作表后,我的 Excel 工作簿如下
我是一名优秀的程序员,十分优秀!