【问题标题】:What is the most efficient way in JavaScript to parse huge amounts of data from a fileJavaScript中从文件中解析大量数据的最有效方法是什么
【发布时间】:2013-03-23 16:03:47
【问题描述】:

在 JavaScript 中从文件中解析大量数据最有效的方法是什么?

目前我使用 JSON 解析来序列化一个未压缩的 250MB 文件,这真的很慢。有没有一种简单快捷的方法可以从文件中读取大量 JavaScript 数据而无需遍历每个字符?文件中存储的数据只是几个浮点数组?

更新: 该文件包含一个 3d 网格、6 个缓冲区(vert、uv 等)。此外,缓冲区需要呈现为类型化数组。流式传输不是一种选择,因为必须先完全加载文件,然后图形引擎才能继续。也许更好的问题是如何以最有效的方式将巨大的类型化数组从文件传输到 javascript。

【问题讨论】:

  • 在浏览器中还是在 Node.js 中?
  • 文件为什么这么大,为什么一定要浏览器?

标签: javascript json performance


【解决方案1】:

我会为这类 JavaScript 或流解析器推荐基于 SAX 的解析器。

DOM 解析会将整个内容加载到内存中,这不是您提到的大文件的方式。

For Javascript based SAX Parsing (in XML)你可以参考 https://code.google.com/p/jssaxparser/

for JSON 你可以自己写,下面的链接演示了如何用 Javascript 编写一个基本的基于 SAX 的解析器 http://ajaxian.com/archives/javascript-sax-based-parser

【讨论】:

    【解决方案2】:
    【解决方案3】:

    没有一个真正好的方法来做到这一点,因为整个文件将被加载到内存中,我们都知道它们都有很大的内存泄漏。您不能改为添加一些分页来查看该文件的内容吗?

    检查是否有任何插件可以让您以流的形式读取文件,这将大大改善这一点。

    更新

    http://www.html5rocks.com/en/tutorials/file/dndfiles/

    您可能想了解新的 HTML5 API 以读取本地文件。您仍然会遇到下载 250mb 数据的问题。

    【讨论】:

    【解决方案4】:

    我能想到 1 个解决方案和 1 个技巧

    解决方案: 将数据拆分成块扩展:归结为 http 协议。 REST 部分认为 http 有足够的“语言”用于大多数客户端-服务器场景。

    您可以在客户端上设置请求标头 Content-len 来确定每个请求需要多少数据

    然后在后端有一些选项http://httpstatus.es

    • 如果服务器根本无法从数据库中获取那么多数据,请回复 413
    • 如果服务器能够回复但不在请求的标头下(Content-len),则为 417
    • 206 与提供的块,让客户知道“还有更多来自哪里”

    破解: 使用 Websocket 并获取二进制文件。然后使用 html5 FileAPI 将其加载到内存中。 这很可能会失败,因为它不是导致问题的下载,而是解析一个几乎无穷无尽的 JS 对象

    【讨论】:

      【解决方案5】:

      您在浏览器上不走运。您不仅必须下载文件,而且无论如何都必须解析 json。在服务器上解析它,将其分成更小的块,将数据存储到数据库中,然后查询您需要的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 2013-03-07
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 2017-02-11
        相关资源
        最近更新 更多