Qt plot的QWT性能改进

Qt plot的QWT性能改进,qt,sqlite,qwt,Qt,Sqlite,Qwt,我有一个2D数据集X、Y和一个强度值(但缺少一些点)。数据以X、Y和Z的形式存储在sqlite数据库中。每个地块大约有150万行。X范围约为4000分宽,Y范围约为1800分宽。因此,图中只有大约20%的点实际具有指定值,其余点初始化为最小值。根据典型的色条刻度范围(由用户指定),更少的颜色将“可见” 我正在使用QwtPlotSpectrogram(QWT6.1.2)获得我想要的输出。执行SQL查询需要一段时间。然后要花相当长的时间才能完成这个情节。我正在寻找关于如何提高性能的建议,特别是在绘图

我有一个2D数据集X、Y和一个强度值(但缺少一些点)。数据以X、Y和Z的形式存储在sqlite数据库中。每个地块大约有150万行。X范围约为4000分宽,Y范围约为1800分宽。因此,图中只有大约20%的点实际具有指定值,其余点初始化为最小值。根据典型的色条刻度范围(由用户指定),更少的颜色将“可见”

我正在使用QwtPlotSpectrogram(QWT6.1.2)获得我想要的输出。执行SQL查询需要一段时间。然后要花相当长的时间才能完成这个情节。我正在寻找关于如何提高性能的建议,特别是在绘图方面

我附上了一段代码摘录,显示我从数据库中提取数据,然后绘制绘图。我做了一些修改,这样显示的代码更简洁,而不会粘贴整个程序。希望它有意义

QSqlQuery query(tsd_data);
int pl=plot_number, y_count=1800;
query.exec("SELECT max(x), min(x), max(z), min(z) FROM database.plot_data WHERE pl="+QString::number(pl));
query.next();
int max_x = query.value(0).toInt();
int min_x = query.value(1).toInt();
int max_z = query.value(2).toInt();
int min_z = query.value(3).toInt();
int x_count = max_x-min_x;
QVector<double> dr_data(x_count*(y_count+1),-200);

query.exec("SELECT y, x, z FROM database.plot_data WHERE pl="+QString::number(pl));
while (query.next())
{
    int y = query.value(0).toInt();
    int x = query.value(1).toInt();
    dr_data[y*x_count+(x-min_x)] = query.value(2).toDouble();
}

QwtMatrixRasterData *qwtm = new QwtMatrixRasterData();
qwtm->setInterval( Qt::XAxis, QwtInterval( min_x-zero, max_x-zero ) );
qwtm->setInterval( Qt::YAxis, QwtInterval( 0, 1800) );
qwtm->setInterval( Qt::ZAxis, QwtInterval( min_z, max_z ) );
qwtm->setValueMatrix(dr_data,bin_count);
QwtPlotSpectrogram *spec = new QwtPlotSpectrogram();
spec->setRenderThreadCount( 0 ); // use system specific thread count
spec->setCachePolicy( QwtPlotRasterItem::PaintCache );
QwtLinearColorMap *colormap = new QwtLinearColorMap(Qt::black, Qt::white);
colormap->addColorStop(0.1,Qt::blue);
colormap->addColorStop(.3,Qt::cyan);
colormap->addColorStop(.5,Qt::green);
colormap->addColorStop(.7,Qt::yellow);
colormap->addColorStop(.9,Qt::red);
spec->setColorMap(colormap);
spec->setData(qwtm);
spec->setDisplayMode( QwtPlotSpectrogram::ImageMode, true );
ui->dr_plot->setEnabled(true);
ui->dr_scale->setEnabled(true);
ui->dr_scale->setColorBarEnabled(true);
ui->dr_scale->setColorBarWidth(40);
QwtInterval zInterval = spec->data()->interval(Qt::ZAxis);
ui->dr_scale->setColorMap(zInterval,colormap);
spec->attach(ui->dr_plot);
ui->dr_plot->replot();
QSqlQuery查询(tsd_数据);
int pl=绘图编号,y计数=1800;
query.exec(“从database.plot_data中选择max(x)、min(x)、max(z)、min(z),其中pl=“+QString::number(pl));
query.next();
int max_x=query.value(0.toInt();
int min_x=query.value(1.toInt();
int max_z=query.value(2.toInt();
int min_z=query.value(3.toInt();
整数x_计数=最大值x-最小值x;
QVector dr_数据(x_计数*(y_计数+1),-200);
query.exec(“从database.plot_data中选择y、x、z,其中pl=“+QString::number(pl));
while(query.next())
{
int y=query.value(0.toInt();
intx=query.value(1.toInt();
dr_data[y*x_count+(x-min_x)]=query.value(2.toDouble();
}
QwtMatrixRasterData*qwtm=新的QwtMatrixRasterData();
qwtm->setInterval(Qt::XAxis,QwtInterval(min_x-zero,max_x-zero));
qwtm->setInterval(Qt::YAxis,QwtInterval(01800));
qwtm->setInterval(Qt::ZAxis,QwtInterval(min_z,max_z));
qwtm->setValueMatrix(dr_数据、bin_计数);
QwtPlotSpectrogram*spec=新的QwtPlotSpectrogram();
等级库->设置渲染器读取计数(0);//使用系统特定的线程计数
spec->setCachePolicy(QwtPlotRasterItem::PaintCache);
QwtLinearColorMap*colormap=新的QwtLinearColorMap(Qt::黑色,Qt::白色);
colormap->addColorStop(0.1,Qt::蓝色);
colormap->addColorStop(.3,Qt::青色);
colormap->addColorStop(.5,Qt::绿色);
colormap->addColorStop(.7,Qt::黄色);
colormap->addColorStop(.9,Qt::红色);
spec->setColorMap(colormap);
规范->设置数据(qwtm);
spec->setDisplayMode(QwtPlotSpectrogram::ImageMode,true);
ui->dr_plot->setEnabled(真);
ui->dr_scale->setEnabled(真);
ui->dr_scale->setColorBarEnabled(真);
ui->dr_scale->setColorBarWidth(40);
QwtInterval zInterval=spec->data()->interval(Qt::ZAxis);
ui->dr_scale->setColorMap(zInterval,colormap);
规格->附加(用户界面->dr_绘图);
ui->dr_plot->replot();

从SVN主干获取Qwt版本,并在Qwt\u plot\u spectrogram.cpp中启用调试渲染


在我的盒子(i5四核)上运行光谱图示例时,我看到1812x1078像素的图像合成约25ms。运行应用程序时,您在方框上看到了什么数字?您看到了什么数字?

对不起,我应该补充一下,我使用的是Qwt 6.1.2。我使用的是i5-2520 2.5ghz,但通过virtualbox。运行上述例程需要10-15秒,但我想我也需要将sql查询与qwt分开。我的代码中是否有明显的错误?我从未使用过Qwt,所以我几乎复制了这个示例