这能处理 100,000 个值吗?
我在使用 Teechart for javascript 时遇到了问题。 我想在我们的主页上使用 Teechart 显示一个包含 ~500.000 个值的折线图。
我的代码最多可处理 100.000 个值,之后会出现错误“超出最大调用堆栈大小”
teechart.js:72 Uncaught RangeError: Maximum call stack size exceeded
at C (teechart.js:72)
at Tee.Line.Tee.Series.minYValue (teechart.js:130)
at teechart.js:76
at I.eachAxis (teechart.js:134)
at I.minYValue (teechart.js:76)
at x.checkMinMax (teechart.js:39)
at x.adjustRect (teechart.js:113)
at Q.each (teechart.js:79)
at Tee.Chart.draw (teechart.js:150)
at k (teechart-extras.js:24)
我是 Javascript 的初学者,这是我的第一次测试,但我找不到问题所在。 我正在使用 Teechart VCL,显示这么多值没有问题。
TeeChart for Javascript 可以处理这么多值吗?
function draw() {
Chart1=new Tee.Chart("canvas");
Series=new Tee.Line(Chart1);
Chart1.addSeries(Series);
Series.addRandom(200000);
Chart1.axes.left.title.text="[hPa]";
Chart1.axes.bottom.title.text="Date/Time";
Chart1.axes.bottom.labels.dateFormat = "dd.mm.yy hh:mm";
Chart1.series.items[0].marks.drawEvery=120;
Chart1.title.visible = false;
Chart1.legend.visible = false;
changeTheme(Chart1, "minimal");
Chart1.draw();
}
我对 teechart 一无所知,但错误消息实际上相当清楚。
每种语言都使用“调用堆栈”来管理函数调用。每次调用函数时,必须保存当前执行环境(所有局部变量、下一步应执行哪一行等),并且必须为被调用函数设置新的执行环境(其参数、局部变量等)。如果被调用函数随后调用另一个函数,则其当前执行环境也需要保存。
为了管理保存所有这些信息,我们使用堆栈。当您进行调用时,您的信息将保存到堆栈中。当该函数调用另一个函数时,它将被推送到堆栈上。当它解析其执行时,它会在您之前被拉出,当您的函数完成执行时,您将被从堆栈中拉出。
现在来解决您的问题。每次我们将新的函数调用推送到堆栈时,都会占用一定量的内存。虽然很小,但仍然存在。但是调用堆栈可以使用的内存量是有限的。因此,如果一个函数调用另一个函数,而我们又嵌套了另一个函数调用……并且函数调用嵌套得太深,那么调用堆栈就会耗尽内存。一旦发生这种情况,如果您尝试再次调用,计算机将无法正确执行该命令,因此会发生此错误。
那么我们应该怎么做呢?
-
要么您的代码中某个地方有一个递归函数调用,该函数递归得太深。
-
或者 teechart 中的某个地方有一个使用递归的函数,而您传递给它的某个值导致它递归得太深。
“问题”函数可能看起来像这样:
function recurse_x_times(x) {
if (x < 1) {
return;
}
// do some other stuff
return recurse_x_times(x-1);
}
我重现了这个问题,因此我已将其添加到公共跟踪器 (
#1976
)。
并且我已经在下一个维护版本中修复了它。