`
xianbin
  • 浏览: 214617 次
  • 来自: ...
社区版块
存档分类
最新评论

jqPlot 实现动态显示数据,防止内存溢出的实现。

阅读更多
jqPlot是一个十分强大、功能丰富的图表插件,能够显示走势图、柱形图等常用的图表类型,相信国内用的人很多。

大家在使用jqPlot动态更新图表时,也许会碰到过在IE中出现内存溢出的问题,下面我们来看看集中动态更新jqPlot图表的方式:

方式一:通过重建图表实现动态显示。
	var series = [{'test'}];

	var axes = {
		xaxis : {
			renderer : $.jqplot.CategoryAxisRenderer,
			ticks : []
		},
		yaxis : {
			min : 0,
			max : 10,
			tickInterval : 2
		}
	};

	var plotConfig = createBarChartOptions(axes, series);

	resizeGlobalMonitorChartContainer(containerId);

	var plot = $.jqplot(g_channelDivId, chartData, plotConfig);


实际上我们通过重复的创建图表,确实可以实现动态更新,不过在IE下,我们会发现内存增长很厉害,起初,通过尝试在重新创建图表时,提前销毁旧的图表来释放内存:
/**
 * 将plot图表从容器中销毁。
 * 
 * @param containerId
 *            容器ID。
 * @param plot
 *            在容器中的图表。
 */
function releasePlotChart(containerId, plot) {
	if (plot) {
		plot.destroy();

		var elementId = '#' + containerId;
		$(elementId).unbind(); // for iexplorer
		$(elementId).empty();

		plot = null;
	}
}


当我们观察内存变化的时候,会发现销毁图表时内存减少了,但是重建之后,内存会比原来多出一些,一定时间以后,内存就会不断的增加,最后导致内存溢出。

方式二:通过动态数据加载,重绘实现。
/**
 * 重绘plot图表。
 * 
 * @param containerId
 *            容器ID。
 * @param chartData
 *            图表数据。
 * @param plotConfig
 *            图表配置信息。
 * @returns 返回重绘后的图表对象。
 */
function replotChart(plot, chartData) {
	setChartDataToPlot(plot, chartData);

	plot.replot({
		resetAxes : true
	});

	return plot;
}

/**
 * 将最新的数据设置到plot图表中。
 * 
 * @param plot
 * @param chartData
 */
function setChartDataToPlot(plot, chartData) {
	for ( var i = 0; i < plot.series.length; i++) {
		for ( var j = 0; j < plot.series[i].data.length; j++) {
			try {
				plot.series[i].data[j][1] = chartData[i][j];
			} catch (e) {
			}
		}
	}
}


通过运用这种方式,再次观察内存变化,会发现内存溢出问题已经不存在了。

从中我们发现,只要重建Plot图表,内存就会出现递增的现象,因此,当我们需要切换图表的时候,最好将原来的图表隐藏起来,当再次需要显示的时候,再恢复显示,从而避免重复创建图表,从而导致内存溢出。
3
0
分享到:
评论
8 楼 coolboy09 2013-06-04  
楼主,能否给个完整的例子?在下在用jqplot绘图时,在添加了定时刷新功能后,切换标签页时,图表不能立即显示,需要等待一段时间才能显示,搞的我很头疼啊。希望能给个动态更新的完整例子,多谢。
7 楼 xianbin 2013-01-29  
xinghe_wang 写道
function drawPlot()
var plotPoint = {
   ..,
   data:[data],
   ..
}
if(plotHandle){
  plotHandle.destroy();
  plotHandle.replot(plotPoint);
}else{
  plotHandle =  $.jqplot("divId",[data],plotPoint);
}
我用了一个ajax 然后掉用这个方法结果内存溢出了,你有什么好的解决方案没.


参看这篇博文:
http://xianbin.iteye.com/blog/1777748
6 楼 xinghe_wang 2013-01-22  
function drawPlot()
var plotPoint = {
   ..,
   data:[data],
   ..
}
if(plotHandle){
  plotHandle.destroy();
  plotHandle.replot(plotPoint);
}else{
  plotHandle =  $.jqplot("divId",[data],plotPoint);
}
我用了一个ajax 然后掉用这个方法结果内存溢出了,你有什么好的解决方案没.
5 楼 xianbin 2012-12-20  
myisyao 写道
还有var plotConfig = createBarChartOptions(axes, series);  

resizeGlobalMonitorChartContainer(containerId); 这代码什么意思啊,麻烦你解释解释。


这个只是解释内存可能到只内存溢出的问题,不是完整的应用,你运行了也不会有效果。
4 楼 myisyao 2012-12-18  
还有var plotConfig = createBarChartOptions(axes, series);  

resizeGlobalMonitorChartContainer(containerId); 这代码什么意思啊,麻烦你解释解释。
3 楼 myisyao 2012-12-18  
你运行过没有啊?怎么我在jsp页面输入你的代码,就报错,1.var series = [{'test'}];  
爆红!
2 楼 xianbin 2012-09-17  
ray_linn 写道
内存溢出 和 内存不足 是两个概念,乱来吧你。


并不是内存不足的问题,而是jqplot不断的重建之后,会在某些浏览器(比如IE中)产生内存泄露,从而导致内存不断的快速增长,最后沾满内存,出现内存溢出。

本人的测试环境为:IE8(存在泄露)、firefox 14(不存在泄露)、chrome 21(不存在泄露)。

不知道以上解释能解答楼上的疑问?
1 楼 ray_linn 2012-09-13  
内存溢出 和 内存不足 是两个概念,乱来吧你。

相关推荐

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿加载到内存中。为了防止这种问题,我们需要采用优化策略来高效地处理大量数据。 1. **分块读取*...

    易语言防止文件内存溢出源码

    在编程领域,内存管理是至关重要的,特别是在处理大文件时,如何有效防止内存溢出是开发者需要关注的核心问题。易语言是一种以中文编程为特色的编程环境,它为初学者提供了友好的界面和易于理解的语法。在这个场景下...

    易语言防止文件内存溢出

    总结来说,易语言防止文件内存溢出的关键在于分块读取和及时释放内存,通过“读入子程序”实现这一目标。在编程实践中,应结合错误处理、数据结构优化等策略,以确保程序的稳定性和效率。通过深入理解这些知识点并...

    phpExcel导出大量数据出现内存溢出错误的解决方法

    下面将详细探讨如何解决phpExcel导出大量数据时出现的内存溢出问题。 首先,需要了解phpExcel在内存使用上的机制。默认情况下,PHPExcel使用内存来存储单元格信息。这意味着,如果一次性读取或写入大量数据,就很...

    加载大图片的时候如何防止内存溢出

    加载大图片时如何防止内存溢出 在 Android 系统中,加载大图片时经常会出现内存溢出的问题,这是因为 Android 系统给图片分配的内存只有 8M,当加载大量图片时,很容易超出这个限制,导致 OOM(Out of Memory)错误...

    通用Excel导入设计方案的实现源码不会内存溢出

    根据这个设计方案,做了详细的实现,经项目验证,Excel文件20W条数据不成问题,因为Excel解析是我自己原创的行级处理器,不会一次性生成很多对象,因此不存在内存溢出现象,只要excel文件放得下,有多少记录都没问题...

    Android防止内存溢出浅析.zip

    理解并防止Android应用中的内存溢出是优化应用性能的关键环节。以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,...

    如何避免JDBC引起的内存溢出情况

    然而,在处理大数据集时,如果不注意细节,很容易遇到内存溢出的问题。本文将重点讨论如何在MySQL、SQL Server以及Oracle三种不同的数据库环境下,通过合理配置和优化策略来避免内存溢出。 #### 一、理解内存溢出的...

    java解决大批量数据导出Excel产生内存溢出的方案

    在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...

    防止内存溢出_jar文件_

    在“防止内存溢出_jar文件_”这个主题中,我们将深入探讨如何管理和优化Java应用程序内存设置,以避免运行时的内存溢出问题,特别是在运行如《我的世界》这样的大型游戏或应用时。 1. **内存溢出概述** 内存溢出...

    JAVA内存溢出问题总结

    在处理大数据时,应该使用 Stream 的方式,而不是把数据读入到内存中,以免内存溢出。 5、把某个对象放到了一个 Set/List/Map 里面,用完了没有尽快释放。 在使用集合时,应该及时释放资源,以免内存溢出。 6、...

    内存溢出配置,内存溢出配置

    内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...

    内存泄漏与内存溢出

    1. **大量数据处理**:当程序需要处理的数据量远远超过可用内存容量时,容易引发内存溢出。 2. **递归调用**:无限或过深的递归调用也会迅速耗尽栈内存,导致内存溢出。 3. **配置不当**:服务器或虚拟机的内存...

    完美解决TensorFlow和Keras大数据量内存溢出的问题

    内存溢出问题是参加kaggle比赛或者做大数据量实验的第一个拦路虎。 以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练。 其实这是有问题的,很容易导致OOM。...

    大数据Excel操作不会内存溢出POI

    绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...

    防止内存溢出浅析

    本文将深入浅谈如何防止Android应用程序中的内存溢出。 首先,我们需要理解Android应用的内存管理机制。Android系统采用垃圾回收(Garbage Collection, GC)机制来自动释放不再使用的对象所占用的内存。当一个对象...

    ListView加载网络图片,防止内存溢出

    本篇文章将深入探讨如何在ListView中加载网络图片,并提供策略防止内存溢出。 首先,我们需要理解内存溢出的原因。当一个Android应用分配的内存超过系统允许的最大限制时,就会发生内存溢出。在ListView中加载网络...

    Android防止内存溢出浅析

    在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...

    内存溢出解决

    ### 内存溢出解决 #### 背景与概念 在Java开发中,内存管理是确保应用程序稳定运行的关键因素之一。当程序运行时分配给它的内存空间不足以支撑其正常运行时,就会出现“内存溢出”(Out of Memory Error,简称OOM...

Global site tag (gtag.js) - Google Analytics