2

我们有一个提供网站的 Apache 服务器。该网站创建了一个 GET-Request,它在服务器上运行一个 C++ 程序。该程序创建一个 3D-Scene 并使用包含该场景的 json 响应 Get-Request。然后使用 WebGL 在浏览器中渲染场景。

这对于小场景非常有效。当 json 大于 ~125 mb 时,Chrome 会抛出错误。Firefox 可以处理高达 ~260 mb 的 json。

我使用 jquery 创建了 Get-Request:

BP2011D1.ServerProxy.prototype.loadMesh = function(requestParameter, callbackOnSuccess,   callbackOnError)
{   
$.ajax({
    type: "GET",
    url: this.getServerURL() + "/cgi-bin/" + this._treemapDirectory + "/hpi_bp2011_app_fcgi",
    data: requestParameter + "&functionName=getMesh",
    dataType: "json",
    success: callbackOnSuccess.execute,
    error: callbackOnError.execute
});
};

对于大型 json,会执行 callbackOnError,因此 json 似乎无效。

我知道 json 应该是完全有效的。

我认为浏览器无法处理大 json 或大字符串。他在末尾剪辑了一些字符,因此缺少的括号使 json 无效。

有没有办法处理这个问题?我需要处理高达 800 mb 的 json。

4

3 回答 3

2

通过 AJAX 分块(以几 MB 为单位)下载它们。假设您有一个高级浏览器(由于 WebGL),您可以使用诸如“线程”之类的网络工作者在后台批量解析它们,然后将它们添加到主对象以供使用。

对于每个块:

download -> create worker -> parse JSON in worker -> add to main object

即使它绕过了 800MB JSON 解析问题,我也不知道 800MB 对象的影响。它在浏览器堆上仍然很重。

于 2012-05-23T15:18:26.340 回答
2

您需要确定造成问题的原因:

  1. 获取那么大的json
  2. 评估那么大的 json (eval())
  3. 要求 javascript 存储这个

我假设您通过 xhr 获取 json,在前两种情况下,您可以尝试创建一些分页,在其中添加 GET-parameter part={0,1,2,3,4,5...},允许浏览器在多个 xhr 请求中获取一个巨大的 json(通过实现这个服务器端)。这将需要服务器将其拆分,而浏览器将其合并:

{a:1, b:5} - 拆分 -> {a:1} 和 {b:5} - 合并 -> {a:1, b:5}

或者:

[1, 5] - 拆分 -> [1] 和 [5] - 合并 -> [1, 5]

请理解,在执行此操作时,您需要找到一个拆分和合并的好地方,即在这种情况下:

{小:<1mb 对象>,巨大:<799mb 对象>}

或者您可能决定只获取字符串并拆分和合并它。

于 2012-05-23T15:18:34.883 回答
2

您可以尝试使用更紧凑的格式

http://code.google.com/p/webgl-loader/

您还可以滚动您自己的格式并使用二进制 XHR 直接以二进制格式下载大部分内容

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

于 2012-05-24T03:40:29.413 回答