26 个解决方案
#1
只有在内存中操作是最快的,至于几百万个点,我没有敢想会是个什么情况,不过可以给你个内存中绘图再显式大图片上的例子,兴许对你有帮助:
http://download.csdn.net/detail/veron_04/2368159
http://download.csdn.net/detail/veron_04/2368159
#2
#3
vb绘几百万个点也最多也就十几秒钟,不过这几百万个点绘成的曲线挤在一屏还有什么特征可言,都成面了。
每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理.
每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理.
#4
1.大量增加CPU和GPU的核数;
2.大量增加内存和显存的G数.
2.大量增加内存和显存的G数.
#5
另外,想在放大和缩小时不影响图像质量,得用矢量图形.
#6
分级显示,缩小时细节不显示,放大显示局部细节
#7
哪位高手能说的具体点么?最好有代码,谢谢了.
数据如
时间(小时) 温度
0.00027778 16.381
0.00055556 17.488
0.00083333 19.560
0.00111111 25.624
0.00138889 36.682
0.00166667 23.740
0.00194444 16.797
......
在文本里有百万行,怎么才能提高速度啊,绘制使屏幕分辨率有限,肯定有很多重复的点,如何才能只画不重复的点,这样就可以不改变图形的形态,但怎么实现才能速度快请高手指点
数据如
时间(小时) 温度
0.00027778 16.381
0.00055556 17.488
0.00083333 19.560
0.00111111 25.624
0.00138889 36.682
0.00166667 23.740
0.00194444 16.797
......
在文本里有百万行,怎么才能提高速度啊,绘制使屏幕分辨率有限,肯定有很多重复的点,如何才能只画不重复的点,这样就可以不改变图形的形态,但怎么实现才能速度快请高手指点
#8
这么大的数据量,取特征数据是关键,而不是全画.
按照LS给的数据,我考虑应该这样做.
大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.
如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。
另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。
按照LS给的数据,我考虑应该这样做.
大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.
如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。
另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。
#9
我是个初学者,希望大家指教,取特征数据最好最快的算法是什么,谢谢了?给我写的更详细点吧
#10
可把数据按时间等分为若干段(段数肯定要小于能显示的点数),每一段取其平均值(或中位数)作为该段的代表(特征,不用极值,因为一段内会有很多极值),绘出曲线即可,这样可基本保留图形的特征,你大可不必纠结于图形的某些时段会出现高峰或低谷,想想谁能从几百万个点中找到高峰或低谷?即使想看更多细节也可通过放大图形得到。
图形的放大与缩小:由上面的绘制方法,只需改变段的长度(如一天改为一小时,一秒改为十分钟)即可实现图形的放大与缩小。
图形的放大与缩小:由上面的绘制方法,只需改变段的长度(如一天改为一小时,一秒改为十分钟)即可实现图形的放大与缩小。
#11
我想按温度数据的大小来找特征点,这怎么实现啊?有什么好的算法?谢谢大家指教
#12
我觉得楼主作为一个初学者就不要一下子塞太多东西.
还是先回头去实现那个最初的目标吧:
假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
所以剩下的就是如何挑选数据的事了.
这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
所以楼主可以自己解决吧.
还是先回头去实现那个最初的目标吧:
假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
所以剩下的就是如何挑选数据的事了.
这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
所以楼主可以自己解决吧.
#13
至于"特征点", 你把任何一个股票一年的变化曲线压到一屏显示, 还能从上面辨别出每一天的"特征"么? 更何况你的数据压缩比远大于这个.
别人的思路不见得适合你的问题, 还是小马过河吧.
#14
我想用位图法实现重复数据不显示,怎么实现啊,请高手指点
#15
你想得也太多了点,不就是一条曲线,搞得这么复杂。
1、写内存DC位图只是在机器性能的确不能满足的情况下才会考虑,重要的是算法,否则就是直接写屏也不会快。
2、关于特征,特征只是一个相对概念,拿你的温度采集数据来说,若一分钟采集一次,则这个数据就只是这一分钟的特征,若一天一次,则这个数据就是一天的特征,温度与时间本身是一个连续函数,你采集到的数据尽管间隔很小,但并 不能代表就是温度变化的曲线,只能是一种近似,所以你的数据已经是温度曲线的“特征”了,你还要怎样的特征?同样的,你把现有数据 任意等距拿出一部份,或者一段时间内的多个数据的平均值、中位数等,都可以作为“特征”。(注:初中数学统计:平均值、中位数、众数可以作为数据的代表 )
3、重复数据不显示,数据里有“重复数据”本身就是数据的一个特征,你不画,不就丢了这个特征?应该说,若一段时间内的重复数据比较多,那你就取这段时间的众数作为这段时间的“特征”就是了。
最后,人眼能看到最多不会超过屏幕的宽度,最多也就一两千个点,用效率最慢的PSet来画都已经足够了,你要做的,就是每次画图时选出这些点。
#16
最简单的办法:
定义一个值A,这个值代表物理界面上最多能显示的温度点的数量,比如1000,超过此值的话显示的相邻点已经在物理上是同一像素点了,再显示就是无意义,白费CPU与内存等硬件资源.
然后绘图时,肯定会有一个显示范围,是所有数据都显示呢,还是只显示某些天之内的数据.
显示范围确定后,就能得到这个范围内的原始数据数量,这里假设你要显示所有数据,就是从0到1000000.
那么,由于物理界面上最多只能显示A个温度点,因此只需要每隔1000000/(1000000-A)取一个温度点显示出来就行了.
这样,无论何时只有A个温度点在显示,速度无论如何也不会慢啦.
#17
如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如何每隔多少点取就能把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点
#18
你可以做一些试验,先不要考虑效率问题
1,全画出来
2,每隔一个点画一个
3,每隔5个点画一个
4,每隔10个点画一个
先看看这些有什么区别,自己有个清晰直观的认识
然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉?
1,全画出来
2,每隔一个点画一个
3,每隔5个点画一个
4,每隔10个点画一个
先看看这些有什么区别,自己有个清晰直观的认识
然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉?
#19
如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如果每隔几点取一点就会把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点
#20
数据可以处理后在绘制,比如连续10个数据求个平均值,作为一个有效数据。实际上很多数据处理都是如此的。
#21
高手们能说的更详细一点么?我是个初学者,不好意思了。最好有详细的算法和代码
#22
更好的算法可求函数的导数(差商)、二阶导数(二阶差商),就怕CPU伤不起
#23
假定要显示数据1百万,用于显示的区域宽度为 1000,则每列像素要表示 1000000 / 1000 = 1000 个点。
即 1 个 X 有 1000 个 Y,这样的绘图只能用统计的方式:
对这 1000 个数据分别求最大值、最小值、平均值;共 1000 组数据。
最后的绘图就是最大值、最小值、平均值 3 条曲线,每条 1000 个折点。
#24
如果不要求一次全部显示出来,就不要全部画。还有,你的这些点差距都很小,你可以选择每隔3个点甚至更多地取一个绘图点,这样100万个数据只有33万个绘图点,这样就快了。每两个绘图点之间用Line方法画线,就是用折线图代替很精确的曲线图,因为两个点之间间距小,看不出来的,既然看不出来,你画那么多也没意义。只有在放大的时候,你算好放大多少倍的时候,两个绘图点之间的差距足够远,必须要把中间省略的点绘上,你再画中间省略的点。
#25
楼主,问题最后解决了么,采取什么样的办法,分享分享!
#26
只绘制看得见和看得清的像素点。
#1
只有在内存中操作是最快的,至于几百万个点,我没有敢想会是个什么情况,不过可以给你个内存中绘图再显式大图片上的例子,兴许对你有帮助:
http://download.csdn.net/detail/veron_04/2368159
http://download.csdn.net/detail/veron_04/2368159
#2
#3
vb绘几百万个点也最多也就十几秒钟,不过这几百万个点绘成的曲线挤在一屏还有什么特征可言,都成面了。
每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理.
每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理.
#4
1.大量增加CPU和GPU的核数;
2.大量增加内存和显存的G数.
2.大量增加内存和显存的G数.
#5
另外,想在放大和缩小时不影响图像质量,得用矢量图形.
#6
分级显示,缩小时细节不显示,放大显示局部细节
#7
哪位高手能说的具体点么?最好有代码,谢谢了.
数据如
时间(小时) 温度
0.00027778 16.381
0.00055556 17.488
0.00083333 19.560
0.00111111 25.624
0.00138889 36.682
0.00166667 23.740
0.00194444 16.797
......
在文本里有百万行,怎么才能提高速度啊,绘制使屏幕分辨率有限,肯定有很多重复的点,如何才能只画不重复的点,这样就可以不改变图形的形态,但怎么实现才能速度快请高手指点
数据如
时间(小时) 温度
0.00027778 16.381
0.00055556 17.488
0.00083333 19.560
0.00111111 25.624
0.00138889 36.682
0.00166667 23.740
0.00194444 16.797
......
在文本里有百万行,怎么才能提高速度啊,绘制使屏幕分辨率有限,肯定有很多重复的点,如何才能只画不重复的点,这样就可以不改变图形的形态,但怎么实现才能速度快请高手指点
#8
这么大的数据量,取特征数据是关键,而不是全画.
按照LS给的数据,我考虑应该这样做.
大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.
如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。
另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。
按照LS给的数据,我考虑应该这样做.
大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.
如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。
另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。
#9
我是个初学者,希望大家指教,取特征数据最好最快的算法是什么,谢谢了?给我写的更详细点吧
#10
可把数据按时间等分为若干段(段数肯定要小于能显示的点数),每一段取其平均值(或中位数)作为该段的代表(特征,不用极值,因为一段内会有很多极值),绘出曲线即可,这样可基本保留图形的特征,你大可不必纠结于图形的某些时段会出现高峰或低谷,想想谁能从几百万个点中找到高峰或低谷?即使想看更多细节也可通过放大图形得到。
图形的放大与缩小:由上面的绘制方法,只需改变段的长度(如一天改为一小时,一秒改为十分钟)即可实现图形的放大与缩小。
图形的放大与缩小:由上面的绘制方法,只需改变段的长度(如一天改为一小时,一秒改为十分钟)即可实现图形的放大与缩小。
#11
我想按温度数据的大小来找特征点,这怎么实现啊?有什么好的算法?谢谢大家指教
#12
我觉得楼主作为一个初学者就不要一下子塞太多东西.
还是先回头去实现那个最初的目标吧:
假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
所以剩下的就是如何挑选数据的事了.
这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
所以楼主可以自己解决吧.
还是先回头去实现那个最初的目标吧:
假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
所以剩下的就是如何挑选数据的事了.
这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
所以楼主可以自己解决吧.
#13
至于"特征点", 你把任何一个股票一年的变化曲线压到一屏显示, 还能从上面辨别出每一天的"特征"么? 更何况你的数据压缩比远大于这个.
别人的思路不见得适合你的问题, 还是小马过河吧.
#14
我想用位图法实现重复数据不显示,怎么实现啊,请高手指点
#15
你想得也太多了点,不就是一条曲线,搞得这么复杂。
1、写内存DC位图只是在机器性能的确不能满足的情况下才会考虑,重要的是算法,否则就是直接写屏也不会快。
2、关于特征,特征只是一个相对概念,拿你的温度采集数据来说,若一分钟采集一次,则这个数据就只是这一分钟的特征,若一天一次,则这个数据就是一天的特征,温度与时间本身是一个连续函数,你采集到的数据尽管间隔很小,但并 不能代表就是温度变化的曲线,只能是一种近似,所以你的数据已经是温度曲线的“特征”了,你还要怎样的特征?同样的,你把现有数据 任意等距拿出一部份,或者一段时间内的多个数据的平均值、中位数等,都可以作为“特征”。(注:初中数学统计:平均值、中位数、众数可以作为数据的代表 )
3、重复数据不显示,数据里有“重复数据”本身就是数据的一个特征,你不画,不就丢了这个特征?应该说,若一段时间内的重复数据比较多,那你就取这段时间的众数作为这段时间的“特征”就是了。
最后,人眼能看到最多不会超过屏幕的宽度,最多也就一两千个点,用效率最慢的PSet来画都已经足够了,你要做的,就是每次画图时选出这些点。
#16
最简单的办法:
定义一个值A,这个值代表物理界面上最多能显示的温度点的数量,比如1000,超过此值的话显示的相邻点已经在物理上是同一像素点了,再显示就是无意义,白费CPU与内存等硬件资源.
然后绘图时,肯定会有一个显示范围,是所有数据都显示呢,还是只显示某些天之内的数据.
显示范围确定后,就能得到这个范围内的原始数据数量,这里假设你要显示所有数据,就是从0到1000000.
那么,由于物理界面上最多只能显示A个温度点,因此只需要每隔1000000/(1000000-A)取一个温度点显示出来就行了.
这样,无论何时只有A个温度点在显示,速度无论如何也不会慢啦.
#17
如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如何每隔多少点取就能把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点
#18
你可以做一些试验,先不要考虑效率问题
1,全画出来
2,每隔一个点画一个
3,每隔5个点画一个
4,每隔10个点画一个
先看看这些有什么区别,自己有个清晰直观的认识
然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉?
1,全画出来
2,每隔一个点画一个
3,每隔5个点画一个
4,每隔10个点画一个
先看看这些有什么区别,自己有个清晰直观的认识
然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉?
#19
如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如果每隔几点取一点就会把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点
#20
数据可以处理后在绘制,比如连续10个数据求个平均值,作为一个有效数据。实际上很多数据处理都是如此的。
#21
高手们能说的更详细一点么?我是个初学者,不好意思了。最好有详细的算法和代码
#22
更好的算法可求函数的导数(差商)、二阶导数(二阶差商),就怕CPU伤不起
#23
假定要显示数据1百万,用于显示的区域宽度为 1000,则每列像素要表示 1000000 / 1000 = 1000 个点。
即 1 个 X 有 1000 个 Y,这样的绘图只能用统计的方式:
对这 1000 个数据分别求最大值、最小值、平均值;共 1000 组数据。
最后的绘图就是最大值、最小值、平均值 3 条曲线,每条 1000 个折点。
#24
如果不要求一次全部显示出来,就不要全部画。还有,你的这些点差距都很小,你可以选择每隔3个点甚至更多地取一个绘图点,这样100万个数据只有33万个绘图点,这样就快了。每两个绘图点之间用Line方法画线,就是用折线图代替很精确的曲线图,因为两个点之间间距小,看不出来的,既然看不出来,你画那么多也没意义。只有在放大的时候,你算好放大多少倍的时候,两个绘图点之间的差距足够远,必须要把中间省略的点绘上,你再画中间省略的点。
#25
楼主,问题最后解决了么,采取什么样的办法,分享分享!
#26
只绘制看得见和看得清的像素点。