浏览器无法处理大型JSON

时间:2012-05-23 15:05:48

标签: javascript json apache2 webgl

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

这适用于小场景。 当json大于~125 mb时,Chrome会抛出错误。 Firefox可以处理高达~260 mb的jsons。

我使用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
});
};

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

我知道json应该完全有效。

我认为浏览器无法处理大型json或大字符串。他在最后剪辑了一些角色,所以缺少的括号使json无效。

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

3 个答案:

答案 0 :(得分:2)

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

对于每个块:

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

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

答案 1 :(得分:2)

您需要确定导致问题的原因:

  1. 抓取json那个大
  2. 评估json那个大(eval())
  3. 要求javascript存储此
  4. 我假设您通过xhr获取json,在前两种情况下,您可以尝试创建一些分页,您可以在其中添加GET参数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]

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

    {small:< 1mb object>,huge:< 799mb object>}

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

答案 2 :(得分:2)

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

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

您也可以使用二进制XHR

滚动自己的格式并直接以二进制格式下载大型部分

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