0

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

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

4

1 回答 1

3

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

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

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

使用单个 4096 × 4096 锯齿状整数数组,具有不同的零分数,并且有或没有压缩,我得到以下结果:

  • 全零
    • 直接的
      • 大小:64.1 MB
      • 序列化:0,10 秒
      • 反序列化:0,10 秒
    • 压缩
      • 大小:0,1 MB
      • 序列化:0,93 秒
      • 反序列化:0.56 秒
  • 第十个零
    • 直接的
      • 大小: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 秒

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

可以看到,大小可以明显变小,但是时间也增加不少,尤其是序列化。

于 2013-02-10T19:22:40.053 回答