2012-03-23 16 views
0

SQLアプリケーションは、xmlとして返されたデータをSQL Serverに照会し、xsltを使用して最終出力を作成します。 システムを高速化する方法として、返されたsql xmlからすべての静的情報を削除し、すべての静的情報を含む大きなXDocumentをキャッシュしました。 xsl変換を実行する直前に、SQL Serverから来たxmlの最後に静的情報を付加したXDocumentを追加します。静的なXDocumentは約50Megで、SQL Serverからビルドするのに数秒かかる。asp.net Webサイトのラージオブジェクトのキャッシュ

私たちの問題は、いったんこれらの大きなXDocのいくつかをキャッシュし始めたら、私たちはキャッシュのプライベートバイトの制限サイズに達し、キャッシュがクリアされたということです。これらのXドキュメントを再構築することは、人々がレポートを実行している間には時間がかかります。これらのXDocsを物理的なファイルに保存しようとは試みていませんでした。なぜなら、これらのXDocsは、毎日発生するすべてのレポートの実行に必要であるからです。

私はAppFabric Cacheをインストールすることを考えましたが、5〜10個の大きなアイテムをそこに保存するのは良い考えではありません。

アイデア? Webサーバーにさらに多くのメモリーをインストールすると、自動的にasp.netがより大きなキャッシュを使用できるようになりますか?私はキャッシュに格納する前にデータを圧縮しようとしましたが(5倍に縮小)、XDocumentを解凍してサーバの速度を落としました。

+0

データベースでシンプルなカスタムキャッシュを使用したり、ディスク上にファイルとして保存したり(よりよい)、このファイルをハンドラを使用してユーザーからダウンロードしてください。 – Aristos

+0

@Aristosユーザーは静的データをダウンロードしません。これはSQL Serverからのxmlと結合され、xsltを介して処理されてレポート出力が作成されます。私はディスクにデータを保存することができますが、その後、すべてのレポートに対してXDocument.Load()を使用してデータをロードする必要があります。より速い方法がなければならないと思った。 – Wavel

+1

ディスクに、http://code.google.com/p/protobuf-net/ – Aristos

答えて

0

最終的には、ファイルをそのままファイルに保存してから、すべての準備が整えられているのでそのままロードしてください。

protobuf-netは超高速で軽量です。私はそれをテストして使用していますが、すべての準備ができているため、何の問題もありません。

+0

ちょうど、それを文字列として保存します。基本的には、XDocument.Save()より優れているわけではありません。 – Wavel

+0

@Wavelああ、あなたは正しいXMLを持っていると思っていませんでした....私は答えを変えます。 – Aristos

0

xmlオブジェクトをバイナリ形式でシリアル化し、varbinary(max)を使用してデータベースに格納できます。その性能については分かりませんが、実装にはそれほど時間がかかりませんので、試してみる価値はあります。

あなたが対処したいことは、レポートにアクセスする最初のユーザーのパフォーマンス上のペナルティです。これを避けるには、レポートをあらかじめ生成して全員にキャッシュできるようにすることができます。

+0

xmlをSQLサーバーにシリアル化すると、返されるxmlがユーザーのデータと1つの大きなxmlの静的データの両方を持つ正方形に戻ります。ユーザーが設計したアドホックなレポートなので、レポートを事前に生成することはできません。ユーザーデータも常に変化しています。 – Wavel

+0

私はあなたが間違っていた、私は限られた報告書の種類と誰もが同じものを取得していたと思ったので、キャッシングを使用したい理由だ –