2

現在、アップロードされたファイル(PDF、DOC、TXTなど)を画像タイプの列に格納するデータベーステーブル(SQL Server 2008 R2)があります。ユーザーがこのファイルをASP.NETアプリケーションからアップロードします。私のプロジェクトは、このテーブルが成長しているサイズを把握することです。その過程で、いくつかの質問を思いつきました。

  1. データベース側では、画像の列タイプが多少減価償却されていることを発見しましたか?varbinary(max)に切り替えることでメリットが得られますか、それともファイルサイズの上限であるvarbinary(5767168)と言うべきでしょうか、それともスペース効率が高い限り、イメージタイプのままにしておくこともできます。心配している?

  2. アプリケーション側では、バイト配列を圧縮したいと思います。Microsoftの組み込みGZipにより、ファイルが小さくなるのではなく大きくなることがありました。SharpZipLibに切り替えましたが、これははるかに優れていますが、それでも同じ問題が発生することがあります。大規模に実装する前に、平均的なファイル圧縮の節約を確認する方法はありますか?彼らが使用している基本的なアルゴリズムを見つけるのに苦労しています。

  3. 私自身のハフマンコードアルゴリズムを書く価値はありますか、それとも元のファイルよりも大きな圧縮ファイルが時々ある場合に同じ問題が発生しますか?

参考までに、重要な場合に備えて、私のアプリのコードは次のとおりです。

    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)を使用する方が効率的です。データベースのバックアップ(ブロブなし)が非常に簡単になるため、VarBinary(Max)にFILESTREAMを使用することを強くお勧めします。

ネイティブフォーマット(圧縮なし)を使用すると、全文検索が可能になることに注意してください。これについて考えると、これは非常に素晴らしいことです。PDF内を検索するには、AdobeからiFilterをインストールする必要があります。しかし、これはキラー機能であり、それなしでは生きていけません。

于 2012-11-02T21:08:00.443 に答える
1

私は急いで自分の質問に答えるのは嫌いですが、データベース内にファイル/画像データをスペース効率よく保存しようとしている他の人のために、私の調査結果を完全な答えにまとめると思いました。

* varbinary(MAX)とImageを使用しますか?

varbinary(MAX)を使用する理由はたくさんありますが、その中でも最も重要なのは、Imageが非推奨になり、SQLの将来のバージョンで完全に削除されることです。それを使って新しいプロジェクトを開始しないことは、将来の問題を芽生えさせるだけです。

この質問の情報によると、多数の画像を格納するためのSQL Serverテーブル構造では、varbinary(MAX)で使用できる操作が増えています。

Varbinary(MAX)は、SQLパラメーターを使用して.NETアプリケーションから簡単にストリーミングできます。負の値は「MAX」の長さです。そのようです:

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

*使用する圧縮アルゴリズムは何ですか?

私はこれについてのまともな答えに本当に近づいていません。ICSharpCode.SharpZipLib.Gzipを使用したところ、多数のもので実行して比較するだけで、組み込みのzip関数よりもパフォーマンスが優れていることがわかりました。

私の結果:

合計ファイルサイズを約20%削減しました。残念ながら、私が持っていたファイルの多くは、それほど圧縮されていないPDFでしたが、それでもいくつかの利点がありました。すでに圧縮されているファイルタイプでは(明らかに)あまり運がありません。

于 2012-11-06T20:16:57.637 に答える