C#中的System.IO.Packaging速度问题

时间:2010-04-22 02:41:14

标签: c# serialization

我正在尝试使用System.IO.Packaging.Package和PackagePart将大量二进制数据序列化为自定义文件格式。我正在尝试使用BinaryFormatter将一组详细的医学成像数据集输出到文件/包中的不同部分。

我可以使用BinaryFormatter将我的所有数据直接输出到FileStream(根本不使用System.IO.Packaging),我的样本数据在大约12秒内输出大约140meg的数据。这个解决方案非常快,也不算太差,但我更喜欢支持压缩的更灵活的格式,以及以灵活的格式存储其他数据的能力。

通过_packagePart.GetStream()获取流并尝试通过BinaryFormatter将数据序列化到此流,我的数据序列化需要大约5到10分钟(这是关闭压缩的。)

System.IO.Packaging.Package类有点像黑盒子,我没有很多经验。任何想法为什么将数据流式传输到这种格式与直接二进制格式化器到文件的性能差别如此之大?我知道我的对象可以相对快速地序列化为二进制格式。为什么写这么久?

2 个答案:

答案 0 :(得分:2)

我确实尝试关闭压缩(NotCompressed),速度差别很小。但我最终找到了一个可行的解决方案。

当不直接转到Package时,我知道BinaryFormatter似乎工作正常,我首先将数据序列化为MemoryStream。然后,使用下面的CopyStream函数,我将MemoryStream复制到PackageStream。

    public static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[32768];
        while (true)
        {
            int read = input.Read(buffer, 0, buffer.Length);
            if (read <= 0)
                return;
            output.Write(buffer, 0, read);
        }
    } 

此解决方案使我的序列化速度降低到10-15秒(相比10分钟),最棒的是,我可以启用“正常”或“高”压缩选项,并对我的数据进行约50%的压缩。 / p>

我真的没有一个很好的答案,为什么这会产生如此巨大的影响,但只是试图让我的代码变成一种格式,我在写入包的循环上有更多的可见性,看看我是否可以对它进行分析更好。

答案 1 :(得分:0)

也许是因为PackagePart使用压缩。

尝试降低压缩级别

http://msdn.microsoft.com/en-us/library/system.io.packaging.compressionoption.aspx

http://msdn.microsoft.com/en-us/library/ms568067.aspx

首先尝试NotCompressed,看看你是否有所改善。