我们有一个提供网站的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。
答案 0 :(得分:2)
通过AJAX按块(批量为几MB)下载它们。假设您有一个高级浏览器(由于WebGL),您可以使用web workers之类的“线程”在后台批量解析它们,然后将它们添加到主对象中以供使用。
对于每个块:
download -> create worker -> parse JSON in worker -> add to main object
即使它绕过了800MB的JSON解析问题,我也不知道800MB对象的影响。它在浏览器堆上仍然很重。
答案 1 :(得分:2)
您需要确定导致问题的原因:
我假设您通过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)