【问题标题】:System.IO.Packaging speed issues in C#C# 中的 System.IO.Packaging 速度问题
【发布时间】:2010-04-22 11:24:41
【问题描述】:

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

我可以使用 BinaryFormatter 将我的所有数据直接输出到 FileStream(根本不使用 System.IO.Packaging),并且我的示例数据在大约 12 秒内输出大约 140meg 的数据。相当快而且还不错的解决方案,但我更喜欢更灵活的格式,支持压缩和以灵活格式存储额外数据的能力。

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

System.IO.Packaging.Package 类有点像我没有丰富经验的黑盒子。知道为什么将数据流式传输到这种格式与文件的直接二进制格式化程序在性能上会有如此大的不同吗?我知道我的对象可以相对快速地序列化为二进制格式。为什么要写这么久?

【问题讨论】:

  • 或许贴一些示例代码

标签: c# serialization


【解决方案1】:

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

知道 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% 的压缩。

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

【讨论】:

    【解决方案2】:

    也许是因为 PackagePart 使用了压缩。

    尝试降低压缩级别

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

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

    先试试 NotCompressed 看看有没有改善。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2011-11-13
      相关资源
      最近更新 更多