【问题标题】:javascript to find memory availablejavascript查找可用内存
【发布时间】:2011-01-02 21:55:41
【问题描述】:

让我们立即明确:这不是关于内存泄漏的问题! 我有一个页面,允许用户输入一些数据和一个 JavaScript 来处理这些数据并产生结果。 JavaScript 在 DIV 上产生增量输出,如下所示:

(function()
{
   var newdiv = document.createElement("div");
   newdiv.innerHTML = produceAnswer();
   result.appendChild(newdiv);
   if (done) {
      return;
   } else {
      setTimeout(arguments.callee, 0);
   }
})();

在某些情况下,计算会产生太多的数据,以至于 IE8 会失败 与此消息:

处理过多数据时存储空间不足

问题是: 有什么方法可以计算出多少数据是太多数据?

正如我所说,没有要解决的错误。这是真正的内存不足,因为计算 需要创建太多的html元素。

如果浏览器成功,我的想法是在执行计算之前运行一个函数以提前计算。但要这样做,一般来说,我认为我需要找到浏览器可用的内存。

欢迎提出任何建议。

【问题讨论】:

  • 数据这么多,用户都应付不来?
  • 用 try/catch 包围代码是否有效?
  • memory.performance.usedJSHeapSize 现在在 Chrome 中运行良好。
  • 我想你的意思是:window.performance.memory.usedJSHeapSize
  • 另请注意,它仅适用于 Chrome。见:docs.webplatform.org/wiki/apis/timing/properties/memory

标签: javascript memory cross-browser large-data-volumes


【解决方案1】:

Javascript(在浏览器中)在沙箱中运行,这意味着它无法访问可能导致安全问题的事物,例如本地文件、系统资源等 - 所以不,您无法检测内存使用情况.

正如其他答案所述,您可以通过在实现之间暂停或使用资源较少的代码来使浏览器的任务更轻松,但每个浏览器都有其局限性。

【讨论】:

  • 感谢您的回答。我怀疑我无法检测到内存使用情况。
【解决方案2】:

玩这个...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>');
document.write(performance.memory.usedJSHeapSize+'<br><br>');
document.write(performance.memory.totalJSHeapSize);

【讨论】:

  • 不幸的是,performance.memory 是 Chrome 专有的东西。
【解决方案3】:

循环将比递归使用更少的内存。

   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done);

您还可以对生成的答案数量设置一些上限。

   var answerCount = 0;
   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done && answerCount++ < 1000);

【讨论】:

  • 你完全误解了这个问题。没有递归!!! -------------------------
  • 将 arguments.callee 传递给 setTimeout 会再次调用该函数,但是您是对的,这不是严格的递归,因为 setTimeout 允许调用函数返回(至少应该返回,但可能延迟 = 0被优化为立即调用,在这种情况下它将是递归)。使用带有计数器的循环仍然会有所帮助,并且代码将更易于阅读。
  • 即使 delay=0 你也没有递归。
【解决方案4】:

我怀疑超时延迟为 0 是问题所在 - 它试图立即重新运行。尝试增加这个。

【讨论】:

  • 不,不是。 0 超时延迟是众所周知的技术。如果您不相信我,请在 Google 周围搜索。
猜你喜欢
  • 2013-11-06
  • 2014-03-26
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多