0

2 つの int ジャグ配列 (int[4096][4096] x2) をシリアル化しています。それらの値のほとんどは 0 です。しかし、シリアライズされたファイルには 128MB の NUL 値があります...また、その大きなオブジェクトのデシリアライズにはしばらく時間がかかります。パフォーマンスを損なうことなくファイルの重量を減らすための最良のオプションは何ですか?

私はバイナリシリアル化を使用していますが、それを維持したいと思います。

4

1 に答える 1

3

オブジェクト全体のデシリアライズに時間がかかりすぎる場合は、ボトルネックがディスクである可能性があります。その場合は、CPU を気にする必要はなく、圧縮を使用できます。

.Net で圧縮を使用する最も簡単な方法は、実際に使用している (ほとんどの場合)GZipStreamをラップして使用することです。StreamFileStream

これにより、ファイルのサイズが小さくなります (特にゼロが多数含まれている場合) が、デシリアライゼーション/シリアル化も遅くなります。

4096 × 4096 のギザギザ整数配列を 1 つ使用し、さまざまなゼロの小数を使用し、圧縮の有無にかかわらず、次の結果が得られました。

  • すべてゼロ
    • 直接
      • サイズ: 64.1 MB
      • シリアル化: 0.10 秒
      • デシリアライゼーション: 0.10 秒
    • 圧縮された
      • サイズ: 0.1 MB
      • シリアル化: 0.93 秒
      • デシリアライゼーション: 0.56 秒
  • 10 番目のゼロ
    • 直接
      • サイズ: 64.1 MB
      • シリアル化: 0.09 秒
      • デシリアライゼーション: 0.09 秒
    • 圧縮された
      • サイズ: 9.8 MB
      • シリアル化: 1.88 秒
      • デシリアライゼーション: 0.74 秒
  • ハーフゼロ
    • 直接
      • サイズ: 64.1 MB
      • シリアル化: 0.09 秒
      • デシリアライゼーション: 0.09 秒
    • 圧縮された
      • サイズ: 38,6 MB
      • シリアル化: 5,99 秒
      • デシリアライゼーション: 1.51 秒
  • ゼロなし
    • 直接
      • サイズ: 64.1 MB
      • シリアル化: 0.10 秒
      • デシリアライゼーション: 0.09 秒
    • 圧縮された
      • サイズ: 64.1 MB
      • シリアル化: 2.99 秒
      • デシリアライゼーション: 0.41 秒

これは を使用しMemoryStreamています。つまり、ほとんど CPU オーバーヘッドのみを測定します。を使用する場合FileStream、差は小さくなる可能性があります。

ご覧のとおり、サイズは大幅に小さくすることができますが、特にシリアル化の場合、時間も大幅に増加します。

于 2013-02-10T19:22:40.053 に答える