JavaScript indexOf 与数百万个匹配项
javascript indexOf with millions of matches
我正在尝试从文件中提取几行表示某些XML元素。用户使用简单的 <input type="file">
标记提供文件,并且该文件被读取为带有 FileReader
的文本,并作为此函数的参数给出:
var relevantDelimiters = [{"begin":"<header>","end":"</header>"}
,{"begin":" <someElement>","end":"</someElement>"}];
function dealWithString(invalidXML) {
var validXML = "";
for (var i=0; i<relevantDelimiters.length; i++) {
delimiter = relevantDelimiters[i];
while (invalidXML.indexOf(delimiter.begin) != -1) {
//while there are relevant elements of this kind left:
startPos = invalidXML.indexOf(delimiter.begin);
endPos = invalidXML.indexOf(delimiter.end);
//append to end result:
validXML+=invalidXML.substring(startPos,endPos+delimiter.end.length)+"'n";
//take this item out of the input to process next item
invalidXML = invalidXML.replace(invalidXML.substring(startPos,endPos+delimiter.end.length),"");
}
}
//return fixed data
return validXML;
}
这种方法似乎适用于输入文本文件中的少量匹配项,但给定 1.5MB 的文件,脚本卡住(使用 Google Chrome 运行,使其选项卡无响应)。该文件包含大约一百万个"相关元素",这意味着来自relevantDelimiters
的匹配项。
如何优化?
与其通过调用 replace
来重复"将项目从输入中取出",不如使用第二个参数来indexOf
:fromIndex
。这样,它将搜索给定索引之后的下一个匹配项,并且您可以遍历非常大的输入而无需触摸它。
function dealWithString(invalidXML) {
var validXML = "";
for (var i=0; i<relevantDelimiters.length; i++) {
var delimiter = relevantDelimiters[i],
pos = 0,
startPos;
while ((startPos = invalidXML.indexOf(delimiter.begin, pos)) != -1) {
//while there are relevant elements of this kind left:
var endPos = invalidXML.indexOf(delimiter.end, startPos);
// assert(endPos != -1) - otherwise this could go horribly wrong
pos = endPos+delimiter.end.length;
//append to end result:
validXML += invalidXML.slice(startPos, pos) + "'n";
}
}
return validXML;
}
时间花
在哪里?我假设你可以把这个大的同步动作分解成几个异步的希望。(每隔一段时间迭代,您可以在恢复之前存储索引和设置超时。这样,您就不会锁定 UI 线程。
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 字母计数:返回重复字母数最多的第一个单词
- 在数组中的一个元素上设置多个值
- 访问$.ajax()函数中的两个不同数组
- 在对象数组中查找多个值的d3范围
- JavaScript indexOf 与数百万个匹配项
- 如何在渲染由数百万个元素组成的html元素时提高性能
- 动态更新数百万个 DOM 元素样式的最快方法
- 数百万个列表映射,100GB数据流畅显示,建议
- 使用 NodeJS 下载数百万张图片
- 在 JQuery 验证中验证多个“数组命名”文件输入和下拉列表
- 在jQuery UI中,如何防止连续调用时运行数百万次的“脉动”效应
- 带有数字的数组 (5+百万)
- 用于数百万行和列的JavaScript数据网格
- 如何将Spine.js与数百万条记录和一个过滤器一起使用
- 如何从文本文件中汇总数百万条记录并在d3中显示
- jquery.显示数百万的数字
- 使用javascript检查数百万组