2012-05-23 33 views
2

我們有一個提供網站的Apache服務器。該網站創建一個GET-Request,在服務器上運行一個C++程序。該程序創建一個3D場景,並用包含該場景的json來回答Get-Request。然後使用WebGL將場景呈現在瀏覽器中。大型JSON無法通過瀏覽器處理

這對小場景非常適用。 當json大於〜125 mb時,Chrome會引發錯誤。 Firefox可以處理高達260 mb的jsons。

我創建使用jQuery的Get請求:

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 
}); 
}; 

對於執行callbackOnError大jsons,所以JSON似乎無效。

我知道json應該是完全有效的。

我認爲瀏覽器不能處理一個大的JSON或一個大的字符串。他在最後剪輯了一些字符,所以丟失的括號會使json無效。

有沒有辦法解決這個問題?我需要處理一個高達800 MB的JSON。

+5

800MB的直接下載的大部分二進制JSON?這相當可笑...嘗試以多個小塊發送。 –

+0

@MarcB事件在大塊,800MB是太龐大的一次解析。瀏覽器甚至扼流幾秒鐘循環10萬次迭代,多800MB數據。 – Joseph

+0

@joseph:我猜這是在一個內部網絡上,所以800mb的千兆位速度並不是太討厭,但它絕對是一個巨大的瀏覽器。 –

回答

2

通過AJAX下載塊(批量數MB)。假設你有一個先進的瀏覽器(由於WebGL的),你可以使用web workers像「線索」來分析他們的一批背景,然後將它們添加到主對象使用。

每塊:

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

即使規避了800MB JSON解析的問題,我不知道一個800MB物體的效果雖然。瀏覽器堆仍然很重。

2

你需要確定什麼造成問題的是:

  1. 獲取的JSON大
  2. 評估的JSON大(的eval())
  3. 要求JavaScript來存儲這些

我假設你通過XHR獲取JSON,前2情況下,你可以嘗試創造一些分頁,你添加一個GET參數部分= {0,1,2,3,4,5 ...},允許瀏覽器在多個xhr請求中獲取一個巨大的json sts(通過實現這個服務器端)。這需要服務器將其拆分,瀏覽器將其合併:

{a:1,b:5} - split - > {a:1}和{b:5} - merge - > {a :1,b:5}

或:

[1,5] - 分裂 - > [1]和[5] - 合併 - >並[1,5]

請理解的是,雖然這樣做,你需要找到一個好地方分割與合併,也就是在這種情況下:

{小:< 1MB對象>,巨大的:< 799mb對象>}

或者你可能決定只取字符串分割和合並。