2

现在我们有一个数据库表(SQL Server 2008 R2),它在图像类型列中存储上传的文件(PDF、DOC、TXT 等)。用户从 ASP.NET 应用程序上传此文件。我的项目是处理这个表的增长大小,并且在此过程中我提出了几个问题。

  1. 在数据库方面,我发现图像列类型据说有点贬值?我是否会从切换到 varbinary(max) 获得任何好处,或者我应该说 varbinary(5767168),因为这是我的文件大小上限,或者我也可以让它保持为图像类型,只要空间效率是担心的?

  2. 在应用程序端,我想压缩字节数组。微软内置的 GZip 有时会使文件变大而不是变小。我切换到 SharpZipLib,它好多了,但我仍然偶尔会遇到同样的问题。在我大规模实施之前,有没有办法找出平均文件压缩节省?我很难找出他们使用的底层算法。

  3. 是否值得编写我自己的 Huffman 代码算法,或者在压缩文件偶尔比原始文件大的情况下会出现同样的问题?

作为参考,以防万一,这是我的应用程序中的代码:

    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();
    }

提前感谢您的帮助。:)

4

2 回答 2

3

那不是字节数组,那是 BLOB。10 年前,您会使用 IMAGE 数据类型。

现在,使用 VARBINARY(MAX) 效率更高 我真的建议人们使用 FILESTREAM 来处理 VarBinary(Max),因为它可以很容易地备份数据库(没有 blob)。

请记住,使用本机格式(不压缩)将允许全文搜索。如果您考虑一下,这是非常不可思议的。您必须从 Adob​​e 安装一些 iFilter 才能在 PDF 中进行搜索。但它是一个杀手级功能,我不能没有它。

于 2012-11-02T21:08:00.443 回答
1

我讨厌成为一个混蛋并回答我自己的问题,但我想我会将我的发现总结为一个完整的答案,以供其他希望在数据库中高效存储文件/图像数据的人使用:

* 使用 varbinary(MAX) 与 Image?

使用 varbinary(MAX) 的原因有很多,但其中最重要的是 Image 已被弃用,并且在未来的 SQL 版本中将完全删除它。不使用它开始任何新项目只是将未来的问题扼杀在萌芽状态。

根据这个问题中的信息:SQL Server table structure for storage a large number of images, varbinary(MAX) 有更多的操作可用。

Varbinary(MAX) 很容易通过使用 SQL 参数从 .NET 应用程序流式传输。负数是“MAX”长度。像这样:

SQLCommand1.Parameters.Add("@binaryValue", SqlDbType.VarBinary, -1).Value = compressedBytes;

* 使用什么压缩算法?

在这个问题上,我真的离一个体面的答案不远了。我使用 ICSharpCode.SharpZipLib.Gzip 并发现它比内置的压缩​​功能具有更好的性能,只需在一堆东西上运行它并进行比较即可。

我的结果:

我将总文件大小减少了大约 20%。不幸的是,我拥有的很多文件都是压缩得不好的 PDF,但仍然有一些好处。已经压缩的文件类型(显然)不太幸运。

于 2012-11-06T20:16:57.637 回答