我正在尝试使用System.IO.Packaging.Package和PackagePart将大量的二进制数据序列化为自定义文件格式。我正在尝试使用BinaryFormatter将一组详细的医学成像数据集输出到文件/包中的不同部分。
我可以使用BinaryFormatter将所有数据直接输出到FileStream (根本不使用System.IO.Packaging ),我的样本数据在大约12秒内输出了大约140meg的数据。速度很快,也不是一个太差的解决方案,但我更喜欢更灵活的格式,支持压缩,并能够以灵活的格式存储额外的数据。
通过_packagePart.GetStream()获取一个流并尝试通过BinaryFormatter将数据序列化到这个流中时,我的数据序列化大约需要5到10分钟(这是在关闭压缩的情况下)。
System.IO.Packaging.Package类在某种程度上是一个黑盒,我对它没有太多的经验。你知道为什么以这种格式传输数据与直接以二进制格式传输文件在性能上会有如此大的不同吗?我知道我的对象可以相对快速地序列化为二进制格式。为什么要写这么长时间?
发布于 2010-04-22 11:24:41
我确实尝试关闭了压缩(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分钟),而且,最棒的是,我可以打开Normal或High压缩选项,并对我的数据进行大约50%的压缩。
我真的没有一个很好的答案,为什么这有这么大的影响,但只是试图让我的代码格式,我有更多的可见性循环写入包,看看我是否可以更好地分析它。
发布于 2010-04-22 10:52:27
也许是因为PackagePart使用了压缩。
尝试降低压缩级别
http://msdn.microsoft.com/en-us/library/system.io.packaging.compressionoption.aspx
http://msdn.microsoft.com/en-us/library/ms568067.aspx
先试试NotCompressed,看看有没有进步。
https://stackoverflow.com/questions/2687919
复制相似问题