我在C#中寻找一个字符串压缩方法,在将其写入网络套接字之前,我可以在数据字符串上运行它?我对任何类型的压缩都相当新,因此我在这里寻找一些建议/指导。
为什么?
这是在一个应用程序中运行的,它在一个服务器上运行,该服务器不断地将消息发送到我们的另一个服务器,但是托管该应用程序的服务器需要使用的数据,这是相当昂贵的。移动主机不是一种选择。
所以我需要一个算法/库,它可以(cpu wise)压缩我们发送的sting消息。我愿意牺牲一些CPU使用来减少网络上的数据。
我不确定会发生什么类型的压缩比,我认为这取决于您发送的字符串消息的类型及其长度。
我正在寻找相当短的字符串,平均从100个字符到256个字符。奇怪的是长约900个字符。
示例字符串:
žŸKO9404ŸMR4ŸTT8DB3CŸTM08:50:26.253ŸDIVFSV09
这是一个较长的例子:
žŸAC15019ŸCI1602ŸSC7ŸZN001ŸPN01ŸFT7F55ŸCLSGKNetworkŸTP1ŸMR0ŸTT9733EŸIDGPAM01;GPAM02;GPAM03;GPAM05;GPAM04;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM02;GPAM03;GPAM04;GPAM05;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM01ŸTM09:01:08.858;09:01:09.066;09:01:09.043;09:01:09.044;09:01:09.066;09:01:09.066;09:01:09.065;09:01:09.068;09:01:09.067;09:01:09.067;09:01:50.395;09:01:50.386;09:01:50.386;09:01:50.386;09:01:50.396;09:01:50.384;09:01:50.385;09:01:50.386;09:01:50.386;09:01:50.384ŸTG584C;584C;584C;584C;584C;584C;584C;584C;584C;584C;589F;589F;589F;589F;589F;589F;589F;589F;589F;589F
所以我正在寻找一种解决方案,我可以在发送服务器上压缩,然后在接收服务器上解压缩。
什么是我最好的解决方案?
答案 0 :(得分:2)
压缩的Gzip示例:
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write ...
sw.Close();
Gzip Sample for Decompress:
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Decompress);
//Decompress
int rByte = sr.Read ...
sr.Close();
答案 1 :(得分:1)
由于你的字符串长度平均为900,为什么你需要压缩它,因为普通网络的最低MTU大约是1474(以太网和ipV4)?知道你的一半字节是UTF-8 1字节编码。
即:如果您通过网络发送100-250 bytes
,则与发送1474 bytes
的费用相同。
答案 2 :(得分:0)
您可以在同一名称空间中查看System.IO.Compression.GZipStream类或其“兄弟”DeflateStream。
答案 3 :(得分:0)
鉴于您控制解决方案的两端。也许你应该考虑使用像Protobuf之类的东西构建的二进制协议,而不是使用Text并尝试压缩它。
如果您可以在一个块中发送更少的数据,但是通过网络将更多这些块作为一个操作发送,则可以降低传输成本。
ABC - 第一次发送(延迟3秒) DEF - 第二次发送
发送ABCDEF 1次发送,但延迟6秒。