当前位置:  开发笔记 > 编程语言 > 正文

优化多维通用数组的二进制序列化

如何解决《优化多维通用数组的二进制序列化》经验,为你挑选了1个好方法。

我有一个我需要二进制序列化的类.该类包含一个字段,如下所示:

private T[,] m_data;

这些多维数组可以相当大(数十万个元素)和任何原始类型.当我在一个对象上尝试标准的.net序列化时,写入磁盘的文件很大,我认为.net存储了很多关于元素类型的重复数据,可能没有那么高效.

我一直在寻找自定义序列化器,但还没有看到任何处理多维通用数组.我已经在内存流的字节数组上尝试了内置的.net压缩,序列化后取得了一些成功,但没有像我希望的那样快速/压缩.

我的问题是,我应该尝试编写一个自定义序列化程序,以便为适当的类型最佳地序列化这个数组(这看起来有点令人生畏),还是应该使用标准的.net序列化并添加压缩?

关于最佳方法的任何建议都是最受欢迎的,或链接到显示如何处理多维通用阵列的序列化的资源 - 正如我所发现的现有示例所提到的不支持这样的结构.



1> TheSoftwareJ..:

这就是我想出来的.下面的代码生成一个int [1000] [10000]并使用BinaryFormatter将其写入2个文件 - 一个压缩,一个不压缩.

压缩文件是1.19 MB(1,255,339字节)解压缩是38.2 MB(40,150,034字节)

        int width = 1000;
        int height = 10000;
        List list = new List();
        for (int i = 0; i < height; i++)
        {
            list.Add(Enumerable.Range(0, width).ToArray());
        }
        int[][] bazillionInts = list.ToArray();
        using (FileStream fsZ = new FileStream("c:\\temp_zipped.txt", FileMode.Create))
        using (FileStream fs = new FileStream("c:\\temp_notZipped.txt", FileMode.Create))
        using (GZipStream gz = new GZipStream(fsZ, CompressionMode.Compress))
        {
            BinaryFormatter f = new BinaryFormatter();
            f.Serialize(gz, bazillionInts);
            f.Serialize(fs, bazillionInts);
        }

我想不出更好/更简单的方法来做到这一点.拉链版非常紧凑.

我会选择BinaryFormatter + GZipStream.制作定制的东西根本不会很有趣.


[由MG编辑]我希望你不会被编辑冒犯,但是统一的重复范围(0,宽度)正在大大扭曲事物; 改成:

        int width = 1000;
        int height = 10000;
        Random rand = new Random(123456);
        int[,] bazillionInts = new int[width, height];
        for(int i = 0 ; i < width;i++)
            for (int j = 0; j < height; j++)
            {
                bazillionInts[i, j] = rand.Next(50000);
            }

试试吧; 你会看到temp_notZipped.txt40MB,temp_zipped.txt62MB.不太吸引人......


当然你不能压缩随机数据.但是可以合理地压缩大量有意义的数据.所以我认为压缩可能很有吸引力.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有