1

wcf サービスでの圧縮に関する質問です。netnamedpipe バインディングを使用して、いくつかのエンティティ オブジェクトを呼び出し元のアプリケーションに送信しています。それが悪い考えであることはわかっていますが、それが私の顧客が実装したい方法です。

そのため、現在、約 45000 個のデータセット (エンティティ オブジェクト) を netnamedpipe 経由で送信する必要があります。それは本当に遅いです。送信前にデータ オブジェクトを byte[] に圧縮するクラスを実装しましたが、45000 セットの送受信にはまだ約 45 秒かかります。

私はこのように圧縮しています:

public static byte[] Compress<T>(T data)
{
    byte[] result = null;
    using (var memory = new MemoryStream())
    {
        using (var zip = new DeflateStream(memory, CompressionMode.Compress, true))
        {
            var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            formatter.Serialize(zip, data);
        }
        result = memory.ToArray();
    }
    return result;
}

それを改善する方法はありますか?45 秒は長すぎます :( 主な理由は、エンティティ オブジェクトのシリアル化である可能性があります..しかし、それをスピードアップするにはどうすればよいですか?

4

2 に答える 2

1

byte []を使用しているので、完全に制御できるようです。その場合は、シリアライザーとしてprotobuf-netを試すことをお勧めします。これにより、使用するCPUが大幅に少なくなり、通常は帯域幅も大幅に少なくなります。

dtaが文字列(説明内のテキストの段落など)によって支配されている場合は、GZipStream / DeflateStreamをミックスに追加して(すでに示したように)、さらに数バイトの帯域幅を削減することもできます。

通常、POCOからprotobuf-netへの切り替えは非常に簡単です。


データセットがDataSet/DataTableを意味する場合、内部バイナリシリアル化を有効にすると役立ちます(BinaryFormatterを介してもデフォルトでXMLを使用します)。その場合は、RemotingFormatプロパティをbinaryに変更します。

于 2012-01-06T16:26:26.847 に答える
1

DTO パターンを使用してみてください。必須フィールドのみを送信

于 2012-01-06T15:44:49.543 に答える