是否有一种快速且非花哨的 C# 代码/算法来压缩接近最大信息密度的逗号分隔数字字符串
本文关键字:信息 接近 压缩 数字字符 字符串 数字 分隔 算法 代码 一种 是否 | 更新日期: 2023-09-27 17:56:31
简而言之,我通过创建一个执行行 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字符串...或存储为字节数组。
十六进制表示形式怎么样,其中每个数字代表字符字节(半字节)的 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
或者更简单的选择可能是将字段切换到文本或 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 子句是可选的