序列化大型int数组

时间:2013-02-10 16:17:26

标签: c# arrays serialization int jagged-arrays

我正在序列化两个int锯齿状数组(int [4096] [4096] x2)。它们的大多数值都是0.但是序列化文件有128MB的NUL值...而且,反序列化这个大对象需要一段时间。在不损害性能的情况下减少文件重量的最佳选择是什么?

我正在使用二进制序列化,我想继续使用它。

1 个答案:

答案 0 :(得分:3)

如果反序列化整个对象花费的时间太长,那么瓶颈可能就是磁盘。如果是这种情况,那么您不必担心CPU,您可以使用压缩。

在.Net中使用压缩的最简单方法是使用GZipStream来包装您正在使用的实际Stream(很可能是FileStream)。

这将导致文件较小(特别是如果它包含大量零),但它也会减慢序列化速度。

使用单个4096×4096锯齿状整数数组,其中包含各种零和有或没有压缩,我得到以下结果:

  • 全部为零
    • 直接
      • 大小:64,1 MB
      • 序列化:0,10秒
      • 反序列化:0,10秒
    • 压缩
      • 大小:0,1 MB
      • 序列化:0,93 s
      • 反序列化:0,56 s
  • 第十个零
    • 直接
      • 大小:64,1 MB
      • 序列化:0,09 s
      • 反序列化:0,09 s
    • 压缩
      • 大小:9,8 MB
      • 序列化:1,88秒
      • 反序列化:0,74 s
  • 半零
    • 直接
      • 大小:64,1 MB
      • 序列化:0,09 s
      • 反序列化:0,09 s
    • 压缩
      • 大小:38,6 MB
      • 序列化:5,99 s
      • 反序列化:1,51秒
  • 没有零
    • 直接
      • 大小:64,1 MB
      • 序列化:0,10秒
      • 反序列化:0,09 s
    • 压缩
      • 大小:64,1 MB
      • 序列化:2,99 s
      • 反序列化:0,41 s

这是使用MemoryStream,这意味着它几乎只测量CPU开销。如果您要使用FileStream,差异可能会更小。

正如您所看到的,尺寸可以显着缩小,但时间也会增加很多,特别是对于序列化。