【发布时间】:2010-11-11 18:50:11
【问题描述】:
我正在为客户开发一个基于 Web 的文档搜索/查看系统。该系统的一部分是允许客户搜索文档中包含的术语的搜索系统。我已经创建了必要的搜索数据文件,但是需要加载大量数据,加载所有数据需要 8-20 秒。根据需要搜索的文档,数据分为 40-100 个文件。每个文件大小在 40-350kb 之间。
此外,此应用程序必须能够在本地文件系统上运行,也可以通过网络服务器运行。
当网页加载时,我可以生成我需要加载的搜索数据文件的列表。必须先加载整个列表,然后才能将网页视为功能正常。
说完前言,让我们看看我现在是怎么做的。
知道整个网页加载完毕后,我调用了一个loadData()函数
function loadData(){
var d = new Date();
var curr_min = d.getMinutes();
var curr_sec = d.getSeconds();
var curr_mil = d.getMilliseconds();
console.log("test.js started background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
recursiveCall();
}
function recursiveCall(){
if(file_array.length > 0){
var string = file_array.pop();
setTimeout(function(){$.getScript(string,recursiveCall);},1);
}
else{
var d = new Date();
var curr_min = d.getMinutes();
var curr_sec = d.getSeconds();
var curr_mil = d.getMilliseconds();
console.log("test.js stopped background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
}
}
它的作用是按顺序处理一组文件,在文件之间休息 1 毫秒。这有助于防止浏览器在加载过程中被完全锁定,但浏览器仍然容易因加载数据而陷入困境。我正在加载的每个文件如下所示:
AddToBookData(0,[0,1,2,3,4,5,6,7,8]);
AddToBookData(1,[0,1,2,3,4,5,6,7,8]);
AddToBookData(2,[0,1,2,3,4,5,6,7,8]);
其中每一行都是一个向数组添加数据的函数调用。 “AddToBookData”函数只做以下事情:
function AddToBookData(index1,value1){
BookData[BookIndex].push([index1,value1]);
}
这是现有系统。加载所有数据后,“AddToBookData”可以被调用 100,000+ 次。
我认为这非常低效,所以我编写了一个脚本来获取包含上述所有函数调用的 test.js 文件,并对其进行处理以将其更改为一个巨大的数组,该数组等于 BookData 的数据结构创造。我没有像旧系统那样进行所有函数调用,而是简单地执行以下操作:
var test_array[..........(data structure I need).......]
BookData[BookIndex] = test_array;
我希望看到性能提高,因为我删除了上面的所有函数调用,这种方法需要稍微多一点的时间来创建确切的数据结构。我应该注意到“test_array”在我的真实世界测试中包含略超过 90,000 个元素。
似乎两种加载数据的方法具有大致相同的 CPU 利用率。我很惊讶地发现这一点,因为我预计第二种方法需要很少的 CPU 时间,因为数据结构是事先创建的。
请指教?
【问题讨论】:
-
您必须一次加载所有数据吗?我会使其延迟加载 - 即仅加载所需的记录。另外,为什么不使用一些更结构化的格式来存储数据,无论是 RDBMS 还是 BerkeleyDb 等?
-
不幸的是,我需要一次全部加载。此应用程序是具有搜索功能的文档查看系统。当用户“搜索”一个关键字时,所有搜索数据都需要立即出现......有一个初始加载时间,然后当用户使用“搜索”功能时额外的加载时间是我们在早期版本中所拥有的,并且是我们希望为重写解决的最大投诉之一。
标签: javascript jquery data-structures