Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 压缩XML度量。_C#_Xml_Winforms_Vb6_Compression - Fatal编程技术网

C# 压缩XML度量。

C# 压缩XML度量。,c#,xml,winforms,vb6,compression,C#,Xml,Winforms,Vb6,Compression,我有一个客户机-服务器应用程序,它通过TCP/IP将XML从客户机发送到服务器,然后广播到其他客户机。我如何知道XML的最小大小是多少,这将保证通过压缩XML而不是通过常规流发送来提高性能 这方面有什么好的衡量标准吗?一定要压缩它 它将为任何超过2个标签的内容节省带宽。要确定压缩是否对您有好处,您需要使用预期将流经系统的实际或预期数据量运行一些测试 希望这能有所帮助。宽松的标准是压缩比单个数据包大的任何内容,但这只是吹毛求疵 没有理由不在应用程序内部使用二进制格式-无论压缩需要多少时间,网络开销

我有一个客户机-服务器应用程序,它通过TCP/IP将XML从客户机发送到服务器,然后广播到其他客户机。我如何知道XML的最小大小是多少,这将保证通过压缩XML而不是通过常规流发送来提高性能


这方面有什么好的衡量标准吗?

一定要压缩它


它将为任何超过2个标签的内容节省带宽。

要确定压缩是否对您有好处,您需要使用预期将流经系统的实际或预期数据量运行一些测试


希望这能有所帮助。

宽松的标准是压缩比单个数据包大的任何内容,但这只是吹毛求疵

没有理由不在应用程序内部使用二进制格式-无论压缩需要多少时间,网络开销都会比压缩慢几个数量级(除非我们讨论的是非常慢的设备)


如果这两个建议不能让您放心,您可以随时进行基准测试,找到压缩的位置。

Xml通常压缩得很好,因为它往往有很多重复

另一种选择是换成二进制格式;BinaryFormatter或NetDataContractSerializer是简单的选项,但与xml相比,它们都是众所周知的不兼容(例如与java不兼容)

另一种选择是可移植的二进制格式,如谷歌的“协议缓冲区”。我维护一个名为.NET/C的版本。这是为了与常规的.NET方法(如XmlSerializer/DataContractSerializer)并行兼容而设计的,但是它比xml小得多,并且对于序列化和反序列化所需的处理(CPU等)要少得多

显示XmlSerializer、DataContractSerializer和protobuf net的一些数字;我以为它包括了有/没有压缩的统计数据,但它们似乎已经消失了


[更新]我应该说-QuickStart项目中有一个TCP/IP示例。

在我们所做的测试中,我们发现了一个巨大的好处,但是请注意CPU的影响

在我参与的一个项目中,我们向运行.NET的客户端发送了大量XML数据(>10兆)。(我不推荐这样做,这只是我们所处的情况!!)我们发现,随着XML文件变得足够大,Microsoft XML库无法解析XML文件(机器内存不足,即使在大于1G的机器上也是如此)。改变XML解析库最终有所帮助,但在此之前,我们对传输的数据启用了GZIP压缩,这有助于我们解析大型文档。在我们的两个基于linux的websphere服务器上,我们能够相当容易地生成XML,然后gzip它。我认为,有50个用户同时执行此操作(加载大约10到20个文件),我们可以用大约50%的cpu完成此操作。XML的压缩似乎在服务器上比在.net gui上处理得更好(即解析/cpu时间),但这可能是由于所使用的Microsoft XML库的上述不足。正如我提到的,有更好的库可用,它们更快,占用更少的内存

在我们的例子中,我们在大小上也得到了巨大的改进——我们将50兆XML文件压缩到10兆左右。这显然也有助于提高网络性能

由于我们担心影响,以及这是否会产生其他后果(我们的用户似乎在大浪中做事,所以我们担心CPU用完了),所以我们有一个配置变量,可以用来打开/关闭gzip。我建议你也这样做


另一件事:在将XML文件持久化到数据库之前,我们还压缩了XML文件,这节省了大约50%的空间(XML文件的大小从几K到几meg不等,但大多相当小)。这可能比选择一个特定的级别来区分何时使用压缩更容易。

但不是有拉链和解压缩的开销吗?你也应该考虑客户端是如何解释XML的,例如,SAX解析大型XML的压缩流,而不是必须通过DOM对整个XML进行解压缩和加载。我不知道C#的用法,但在java中工作得很好:InputStream st=new GZipInputStream(inStream);st.read()@Marko-它实际上是一样的:新的GZipStream(流内,压缩模式。解压缩)