2016-07-09 5 views
2

webglアプリケーションを構築しています。そして、データの逆シリアル化が必要です〜15MB(これは単一のオブジェクトのサイズですが、私のアプリケーションでは約10個です)、このデータのより大きな部分(90%)は浮動小数点数の配列ですJavaScriptでFloat32Arraysに逆シリアル化する必要があります。モバイルデバイスでのJSONの優れた代替製品

現在、私はJSONを使用しています。私のデータには繰り返し数が多く含まれているため、圧縮率が高く、ネットワークパフォーマンスに満足しています。それ以外に。デスクトップ上のパフォーマンスも満足しています。しかし、プレーンなJS配列にデータをロードして逆シリアル化し、それをモバイルデバイス上でFloat32Arraysに変換するのには多くの時間がかかります。

私はprotobuffを使用して考えられますが、私は

プロトコルバッファが大きなメッセージを処理するように設計されていないhttps://protobuffers.codeplex.com/でこれを見ました。 メッセージがそれぞれ1メガバイトを超える場合は、 代替戦略を検討することがあります。

私のアプリケーションのパフォーマンスを向上させるにはどうすればよいですか。どんなSERDESメソッドをテストすればよいですか?

私はこのプロセスを歩いて私の選択肢をテストするのを手伝ってください。あなたがコメントセクションで何かを尋ねるなら、詳細を記入します。

+1

あなたはBSONを見ましたか? – Bergi

+0

@Bergiこれを今すぐチェックします! – Hasan

+0

JSONシリアル化されたデータのサイズは15MBですか、またはデシリアライズされた後のメモリ内のデータのサイズですか? http://bsonspec.org/spec.htmlによると、BSONは32ビットではなく64ビットのフロートを格納するように見えますが、これは残念です。プロトコルバッファにはdouble型とfloat型があります。したがって、32bit浮動小数点型配列の場合、BSONよりコンパクトで速い可能性があります。 – bazza

答えて

1

オブジェクトが1つの大きな浮動小数点配列のようなものなら、JSONでエンコードされた文字列の代わりに生のバイトを送ることができます。

XMLHttpRequestは、responseType = "arraybuffer"です。これで、あなたの「解析ステップ」はvar floats = new Float32Array(xhr.response)に縮小されます。

さらに、このタスクのメモリへの影響を減らすこともできます.15 MBの大きなString +中間配列の場合、約20 MBの倍精度を保持する必要はありません。結果として得られるFloat32Arrayに別の10 MB (ダブルの半分)はほぼ同じ時刻にすべてです。

生のバイト+メモリ内のこのデータを参照するFloat32Arrayを含む1つのArrayBufferがあります。


これがうまく行かない場合は、送信したデータの性質や構造を説明できます。

シリアル化が問題の場合は、バックエンドで使用するコードを使用することもできます。