gpt4 book ai didi

c# - 是否有任何(可逆)方式(在 c# 中)将字符串转换为更小的字符串,当我说更小时我的意思是 "with reduced length"?

转载 作者:行者123 更新时间:2023-12-05 01:51:59 25 4
gpt4 key购买 nike

让我解释一下:在我的用例中,系统为我提供了很多大小可以变化的字符串(字符数;长度),有时它可能非常大!问题是我必须将这个字符串保存在“SQL Server”数据库表的列中,坏消息是我不允许在这个数据库中进行任何迁移,好消息是该列已经有了输入 nvarchar(max)

我之前做了一些研究,并按照以下帖子使用“Gzip”和“Brotli”编写了一个数据压缩器。

https://khalidabuhakmeh.com/compress-strings-with-dotnet-and-csharp

var value = "hello world";
var level = CompressionLevel.SmallestSize;

var bytes = Encoding.Unicode.GetBytes(value);
await using var input = new MemoryStream(bytes);
await using var output = new MemoryStream();

// GZipStream with BrotliStream
await using var stream = new GZipStream(output, level);

await input.CopyToAsync(stream);

var result = output.ToArray();
var resultString = Convert.ToBase64String(result);

实现转换方法后,我创建了生成不同大小(长度)随机字符串的测试,以验证压缩器的性能,此时我注意到以下内容。 “Gzip”和“Brotli”都首先转换为 byte[](字节数组),然后应用压缩,这会按预期提供减小大小的结果向量(字节数组),但随后将结果(byte[])转换为base 64 字符串,在 100% 的测试中,它的字符(长度)比初始字符串多。

我的随机字符串生成器:

var rd_char = new Random();
var rd_length = new Random();
var wordLength = rd_length.Next(randomWordParameters.WordMinLength, randomWordParameters.WordMaxLength);
var sb = new StringBuilder();
int sourceNumber;
for (int i = 0; i < wordLength; i++)
{
sourceNumber = rd_char.Next(randomWordParameters.CharLowerBound, randomWordParameters.CharUpperBound);
sb.Append(Convert.ToChar(sourceNumber));
}
var word = sb.ToString();

我的示例字符串并不完全包含手头案例的完美表示,但我相信它们已经足够好了。这是字符串生成器方法,实际上它在给定的大小范围内生成完全随机的字符串,我在测试中使用了从传递给 Convert.ToChar() 方法的 33 ~ 127 个值中提供的字符。系统提供的字符串是json格式的,实际是url列表(有几万个url),url通常是随机的字符序列,所以我尽量随机生成字符串。

事实是,考虑到我尝试在数据库中保存最初(压缩前)大于列中允许的最大大小(长度)的字符串的情况,在数据库中保存时,“数据”进入相关表列的是压缩后生成的结果“base 64”字符串,而不是缩小大小的向量(字节数组),我相信数据库会拒绝字符串(base 64),因为它的长度(在字符数中)大于原始字符串的长度。

所以这是我的问题,是否有任何(可逆)方法可以将字符串转换为更小的字符串,当我说更小时,我的意思是“减少长度”?看来“Gzip”或“Brotli”并不能解决问题。

PS:我一定要多次强调术语“长度”,以明确在文本中我谈论的是字符数而不是内存长度,因为我在几个论坛上注意到我之前读到过,这种困惑使得很难得出结论。

最佳答案

NVARCHAR(MAX) 类型的列的最大大小为 2 GByte 的存储空间。

由于 NVARCHAR 每个字符使用 2 个字节,这大约是。 10 亿个字符。

所以我认为你实际上不需要进行压缩,如果问题是检索数据时的性能,那么你可以使用服务器端缓存系统。

关于c# - 是否有任何(可逆)方式(在 c# 中)将字符串转换为更小的字符串,当我说更小时我的意思是 "with reduced length"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71884821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com