【发布时间】:2012-11-02 20:25:57
【问题描述】:
现在我们有一个数据库表 (SQL Server 2008 R2),它在图像类型列中存储上传的文件(PDF、DOC、TXT 等)。用户从 ASP.NET 应用程序上传此文件。我的项目是处理这个表的增长大小,并且在此过程中我提出了几个问题。
在数据库方面,我发现图像列类型据说有些贬值?我是否会从切换到 varbinary(max) 获得任何好处,或者我应该说 varbinary(5767168),因为这是我的文件大小上限,或者我也可以让它保持为图像类型,只要空间效率是担心吗?
在应用程序端,我想压缩字节数组。微软内置的 GZip 有时会使文件变大而不是变小。我切换到 SharpZipLib,它好多了,但我仍然偶尔会遇到同样的问题。在我大规模实施之前,有没有办法找出平均文件压缩节省?我很难找出他们使用的底层算法。
是否值得我自己编写一个霍夫曼代码算法,或者在压缩文件偶尔比原始文件大的情况下也会出现同样的问题?
作为参考,以防万一,这是我的应用程序中的代码:
using ICSharpCode.SharpZipLib.GZip;
private static byte[] Compress(byte[] data)
{
MemoryStream output = new MemoryStream();
using (GZipOutputStream gzip = new GZipOutputStream(output))
{
gzip.IsStreamOwner = false;
gzip.Write(data, 0, data.Length);
gzip.Close();
}
return output.ToArray();
}
private static byte[] Decompress(byte[] data)
{
MemoryStream output = new MemoryStream();
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length);
input.Position = 0;
using (GZipInputStream gzip = new GZipInputStream(input))
{
byte[] buff = new byte[64];
int read = gzip.Read(buff, 0, buff.Length);
while (read > 0)
{
output.Write(buff, 0, read);
read = gzip.Read(buff, 0, buff.Length);
}
gzip.Close();
}
return output.ToArray();
}
提前感谢您的帮助。 :)
【问题讨论】:
-
对 SQL Server/这类问题的处理还不够,但我听说资源通常不会持久化到数据库本身(特别是对于大文件之类的东西),只有参考到网络服务器上的位置。
-
您可能需要考虑为压缩算法设置一个单独的列。这样,您可以随着时间的推移针对不同的文件类型使用不同的算法,或者请注意,如果压缩只会导致数据增长,则不使用压缩。
-
Clockwork-Muse,如果将来某个时间点移动文件,则存在链接错误的风险。除了一位碰巧知道不应移动这些特定文件的程序员之外,您没有任何东西可以连接链接和文件。有些东西可能没问题,但在我的情况下,这些是敏感的法律文件,所以无论好坏,我们都希望确保它们留在那里。鉴于此约束,压缩是一种稍微减轻尺寸爆炸的方法。无论如何感谢您的建议!
标签: asp.net sql sql-server-2008 compression sharpziplib