是否存在快速且非花哨的C#代码/算法来压缩接近最大信息密度的逗号分隔数字串?

简而言之,我通过创建执行行ID连接的CLR聚合将自己编程到一个角落,所以我说:

select SumKeys(id), name from SomeTable where name='multiple rows named this' 

我得到类似的东西:

 SumKeys name -------- --------- 1,4,495 multiple rows named this 

但是当SumKeys获得超过8000个字符时它就会死掉,而我认为我无法做任何事情。

作为一个快速解决方案(它只有1%的时间用于我的应用程序)我认为我可能压缩字符串,我认为你们中的一些聪明的人可能知道一个光滑的方式来做到这一点。

类似于base64的0-9和逗号?

如果你为数据找出更合理的存储空间(可能是HashSet),你会好得多…

但是对于压缩,请尝试常规System.IO.Compression.GZipStream( http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx )并根据需要将生成的字节数组转换为base64字符串。 ..或存储为字节数组。

hex表示怎么样,其中每个数字代表一个字符字节的4位半字节(半字节),其中0xa用作逗号? 您只能获得50%的压缩率,但速度快且简单。

不确定你认为它是多么“花哨”,但zip / gzip压缩对任何文本都非常有效(有时可以减少90%或更好)。 由于您已经在使用C#和CLR集成,因此希望设置/部署不会太难。 我还没有修改任何C#库进行压缩,但很容易找到它们。 例如: http : //sharpdevelop.net/OpenSource/SharpZipLib/或http://dotnetzip.codeplex.com/ ,甚至是http://msdn.microsoft.com/en-us/library/system.io.compression。 gzipstream.aspx

或者更简单的选择可能是将字段切换为text或varchar / nvarchar(max),如果可行的话。

您可以使用霍夫曼树 。 这基本上是一种将ascii压缩为二进制的算法。 我被告知这基本上是WinZIP使用的,但我不确定这是否真的如此。 我快速搜索了huffman coding c# ,似乎至少有一个不错的实现,尽管我还没有使用它们中的任何一个。

如果你的“词汇”只是数字和逗号,霍夫曼树会给你很好的压缩。

http://www.enusbaum.com/blog/2009/05/22/example-huffman-compression-routine-in-c/

尝试:

 SELECT name, GROUP_CONCAT(id) FROM SomeTable GROUP BY name WHERE name = 'multiple rows named this' 

我遇到了一个可以与SQL Server一起使用的方法:

 SELECT STUFF(( SELECT ','+id FROM SomeTable a WHERE a.name = b.name FOR XML PATH('') ),1,1,'') AS SumKeys, name FROM SomeTable b GROUP BY name WHERE name = 'multiple rows named this' 

WHERE子句是可选的

    Interesting Posts