使用非常大的Javascript数组或对象

使用非常大的Javascript数组或对象,javascript,jquery,performance,optimization,Javascript,Jquery,Performance,Optimization,目前,我正在编写一个脚本,其中必须存储1250000多个对象。我在jQueryeach()循环中使用push()函数,如下所示: words.push({ "page": pagenumber, "content": word, "hpos": $(this).attr("HPOS"), "vpos": $(this).attr("VPOS"), "width": $(this).attr("WIDTH"), "height": $(this).attr("HEIGHT"

目前,我正在编写一个脚本,其中必须存储1250000多个对象。我在jQuery
each()
循环中使用
push()
函数,如下所示:

words.push({
  "page": pagenumber,
  "content": word,
  "hpos": $(this).attr("HPOS"),
  "vpos": $(this).attr("VPOS"),
  "width": $(this).attr("WIDTH"),
  "height": $(this).attr("HEIGHT")
});
在Chrome浏览器中,退出速度很快,在30到40秒之间,但在InternetExplorer中可能需要360秒

这是一个项目,旧报纸加载,你可以搜索这些报纸的文本。报纸位于目录中,并动态加载。在这次测试中,我使用了1926年10月的报纸,共308页,超过1250000字

有没有更好/更快的方法来实现这一点

有没有更好/更快的方法来实现这一点

是:在服务器上执行,而不是在浏览器中。这还有一个优点,即您可以一次性完成并重用信息

但由于某种原因,假设这是不可能的:

您可以做的第一件事是停止进行数百万不必要的函数调用,只需对每个循环执行一次
$(this)

.....each(function () {
    var $this = $(this);
    words.push({
        "page": pagenumber,
        "content": word,
        "hpos": $this.attr("HPOS"),
        "vpos": $this.attr("VPOS"),
        "width": $this.attr("WIDTH"),
        "height": $this.attr("HEIGHT")
    });
});
通常反复做这件事没什么大不了的(尽管我还是会避免),但如果你做这件事有25万次

如果所有这些属性都是属性,那么可以通过将jQuery从中间删除来完全避免调用:

.....each(function () {
    words.push({
        "page": pagenumber,
        "content": word,
        "hpos": this.getAttribute("HPOS"),
        "vpos": this.getAttribute("VPOS"),
        "width": this.getAttribute("WIDTH"),
        "height": this.getAttribute("HEIGHT")
    });
});
jQuery的
attr
函数非常棒,可以通过某些属性消除各种跨浏览器的麻烦,但我认为这四个函数中的任何一个都不需要特殊处理,甚至在IE上也不需要,所以您可以直接使用DOM的
getAttribute

接下来,一些JavaScript引擎执行
push
的速度比分配给数组末尾的速度慢。这两种说法的作用相同:

myarray.push(entry);
// and
myarray[myarray.length] = entry;

但其他引擎处理推送的速度与分配的速度相同或更快(毕竟,这是一个成熟的优化目标)。所以你可以看看IE是否推得更慢,如果是这样的话,改用赋值法。

你能给我们一些背景知识,说明你为什么要创建125万个对象的数组吗?你最好想想,如果您在浏览器中的JavaScript对象中确实需要1m+个条目。@zerkms:没有使用JavaScripts非类型数组预分配的概念,因为。我想不出向客户端数组添加这么多项的原因。我认为你需要解释你的理由,让我们对你的项目目标有更多的了解。您可能需要重新考虑您的设计。此外,关于编辑、加载和索引报纸,服务器肯定需要做一些工作。谢谢,这使事情加快了一点,但我想我会尝试一下node.js。试图让服务器完成所有的繁重工作,而不是浏览器。@T.J.Crowder不
myarray[myarray.length]=entry创建稀疏数组?在这种情况下可能不是问题,但它可以更改某些应用程序的数组行为。@ultraviol3tlux:不,它不会。它只是在数组的末尾添加一个条目,就像
push
那样。将值赋给
length
使其变大(
var a=[];a.length=10;
)会创建稀疏数组,但添加到数组末尾则不会。