【发布时间】:2013-08-06 02:05:10
【问题描述】:
背景: 我有一个处理和显示大量日志文件的 Web 应用程序。它们通常只有大约 100k 行,但可以达到 400 万行或更多。为了能够滚动浏览该日志文件(用户启动和通过 JavaScript)并过滤具有良好性能的行,我在数据到达后立即为每一行创建一个 DOM 元素(通过 ajax 在 JSON 中)。我发现这对性能更好,然后在后端构建 HTML。之后我将元素保存在一个数组中,我只显示可见的行。
对于最多 100k 行,这只需大约几秒钟,但对于 500k 行(不包括下载),其他任何操作最多需要一分钟。我想进一步提高性能,所以我尝试使用 HTML5 Web Workers。现在的问题是我无法在 Web Worker 中创建元素,甚至在 DOM 之外。所以我最终只在 Web Workers 中进行 json 到 HTML 的转换,并将结果发送到主线程。它在那里被创建并存储在一个数组中。不幸的是,这降低了性能,现在至少需要多花 30 秒。
问题:那么,有什么我不知道的方法可以在 DOM 树之外,在 Web Worker 中创建 DOM 元素吗?如果不是,为什么不呢?在我看来,这不会产生并发问题,因为创建元素可以并行发生而不会出现问题。
【问题讨论】:
-
您是否想过一种解决方案,即按需请求日志行?一次解析 4M 行日志文件是一项繁重的任务,即使您可以在这里以有效的方式使用 WebWorker,也无法获得所需的性能提升。我建议只请求一堆行并像这些无限滚动页面一样处理它们。
-
是的,但这会使过滤选项的实现变得非常困难。我还必须存储 JSON 格式,因为在后端将其解析为 JSON 也需要一分钟,而且没有办法分段完成。它还会降低滚动和过滤性能,这需要几毫秒甚至纳秒。
标签: javascript jquery html web-worker