2 つの int ジャグ配列 (int[4096][4096] x2) をシリアル化しています。それらの値のほとんどは 0 です。しかし、シリアライズされたファイルには 128MB の NUL 値があります...また、その大きなオブジェクトのデシリアライズにはしばらく時間がかかります。パフォーマンスを損なうことなくファイルの重量を減らすための最良のオプションは何ですか?
私はバイナリシリアル化を使用していますが、それを維持したいと思います。
2 つの int ジャグ配列 (int[4096][4096] x2) をシリアル化しています。それらの値のほとんどは 0 です。しかし、シリアライズされたファイルには 128MB の NUL 値があります...また、その大きなオブジェクトのデシリアライズにはしばらく時間がかかります。パフォーマンスを損なうことなくファイルの重量を減らすための最良のオプションは何ですか?
私はバイナリシリアル化を使用していますが、それを維持したいと思います。
オブジェクト全体のデシリアライズに時間がかかりすぎる場合は、ボトルネックがディスクである可能性があります。その場合は、CPU を気にする必要はなく、圧縮を使用できます。
.Net で圧縮を使用する最も簡単な方法は、実際に使用している (ほとんどの場合)GZipStream
をラップして使用することです。Stream
FileStream
これにより、ファイルのサイズが小さくなります (特にゼロが多数含まれている場合) が、デシリアライゼーション/シリアル化も遅くなります。
4096 × 4096 のギザギザ整数配列を 1 つ使用し、さまざまなゼロの小数を使用し、圧縮の有無にかかわらず、次の結果が得られました。
これは を使用しMemoryStream
ています。つまり、ほとんど CPU オーバーヘッドのみを測定します。を使用する場合FileStream
、差は小さくなる可能性があります。
ご覧のとおり、サイズは大幅に小さくすることができますが、特にシリアル化の場合、時間も大幅に増加します。