我正在序列化两个 int 锯齿状数组(int[4096][4096] x2)。它们的大部分值都是 0。但是序列化文件有 128MB 的 NUL 值......此外,反序列化那个大对象需要一段时间。在不影响性能的情况下减轻文件重量的最佳选择是什么?
我正在使用二进制序列化,我想继续使用它。
我正在序列化两个 int 锯齿状数组(int[4096][4096] x2)。它们的大部分值都是 0。但是序列化文件有 128MB 的 NUL 值......此外,反序列化那个大对象需要一段时间。在不影响性能的情况下减轻文件重量的最佳选择是什么?
我正在使用二进制序列化,我想继续使用它。
如果反序列化整个对象花费的时间太长,那么瓶颈很可能是磁盘。如果是这种情况,那么您无需担心 CPU,您可以使用压缩。
在 .Net 中使用压缩的最简单方法是GZipStream
通过包装Stream
您正在使用的实际内容(很可能是 a FileStream
)来使用。
这将导致文件更小(特别是如果它包含大量零),但它也会减慢反序列化/序列化。
使用单个 4096 × 4096 锯齿状整数数组,具有不同的零分数,并且有或没有压缩,我得到以下结果:
这是 using MemoryStream
,这意味着它几乎只测量 CPU 开销。如果您要使用FileStream
,则差异可能会更小。
可以看到,大小可以明显变小,但是时间也增加不少,尤其是序列化。