2

Web サイトを提供する Apache サーバーがあります。Web サイトは、サーバー上で C++ プログラムを実行する GET 要求を作成します。プログラムは 3D シーンを作成し、シーンを含む 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 による) を使用していると仮定すると、 「スレッド」などのWeb ワーカーを使用して、バックグラウンドでそれらをバッチで解析し、メイン オブジェクトに追加して使用することができます。

すべてのチャンクについて:

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 を取得すると仮定します。最初の 2 つのケースでは、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]

これを行っている間、分割とマージに適した場所を見つける必要があることを理解してください。つまり、この場合:

{small: <1MB オブジェクト>, huge:<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 に答える