web-dev-qa-db-ja.com

XMLファイルまたはデータベース?

私は自分のサイトのセクションを書き直し、これがどれだけの書き換えになるかを決定しようとしています。現在、1日1回xmlを生成するWebサービスフィードがあります。次に、このxmlファイルを自分のWebサイトで使用して、一般的な構造を生成します。この情報をデータベースに配置するか、xmlファイルに残すかを決定しようとしています。

  1. ファイルの範囲は4mb-12mbです。
  2. ファイルの深さはどんどん続くので、必要なデータを見つけるために再帰的に検索する必要があります。
  3. .NETシリアライザークラスを使用し、ページが読み込まれるたびに再シリアル化されないように、シリアル化されたファイルをグローバル変数に格納します。

データベースの方が良いと思う理由は次のとおりです。

  1. 内部IDを使用してファイルのどこにいるかを正確に把握できるので、情報を取得するためにファイルを再帰的に検索する必要はありません。
  2. XMLをロード/シリアル化する必要はなく、すでに開いているデータベース接続を使用するだけで済みます。
  3. ファイル内のデータを検索する方が、ファイルを再帰するのではなくSQLクエリを実行するだけなので、より速く(?).

誰かがより良いアイデアを持っていますか?どのオプションがサーバーでより多くのリソースを使用するか、より速くなるでしょうか?

編集:ファイルはWebページが読み込まれるたびに読み込まれます(ただし、シリアル化は1回だけです)。これは、標準ユーザー(真夜中に実行される管理タスクのみ)によって書き込まれるものではありません。

これは、モックアップする前の私の最初の調査です。

2
webnoob

私が正しく理解していれば、データは1日1回正確に変更されます。正直なところ、XMLとして持っていても、行ごとにDBに保存していてもかまいません。大きな違いは、Webアプリケーションでそれをキャッシュした場合です。

基本的には、ファイルを1日に1回だけ読み込む必要があり(これはオンデマンドで発生し、キャッシュされたバージョンの有効期限が切れているかどうかを確認するだけです)、情報をすばやく取得するために最適化された構造にコンテンツを保存します。これにより、ページが何度も何度もファイルを解析するCPU時間を浪費するのを防ぎ、ガベージコレクターの多くの作業を節約できます。

技術的には、10 MBのXMLファイルはオブジェクトと同じ量のメモリを使用する必要があります(テキストベースのエンコーディングの膨張の欠如、およびインデックス作成のためのディクショナリオブジェクトのオーバーヘッドによるもの)、これは最近ではありません。このような変更により、通常、パフォーマンスが数桁向上します。

3
Daniel B

私はjbergerがすでに言ったことを部分的にエコーしています、あなたはすでにそれをするようにあなた自身を話しているようです。

私はデータベースへの移行を支持します。12メガは非常に大きなファイルです。一連のテーブルとして、データベースの能力の一部を使用してクエリを高速化できます。これまでに面倒だったり面倒だったりした新しいことを実行できます。繰り返しになりますが、他の投稿者は、このファイルをどのくらいの頻度でクエリしているのかと尋ねてきました。それが1日1回の場合は、おそらく、たぶん、努力する価値はないかもしれません。ただし、それがXMLの複雑なビットであり、12 MBがそうであると言っている場合、それは十分に費やされた時間であることがわかります。

XMLファイルをデータストアとして使用するという考えを却下するのではなく、過去にWebサイトで使用したことがありますが、それらのWebサイトのサイズとトラフィックは価値があることを意味します。 Webサイトは毎月多くの訪問者を獲得せず、使用されるXMLファイルのサイズはKBで測定されます。

5

あなたの質問をもう一度読み直しましたが、もう一度考えました。現時点では、すべての作業をWebサーバーで実行しています。データベースサーバーを使用する場合、SQL Serverは実行プランをキャッシュします。私の直感は、データベースサーバーを使用することで、リソースをより効率的に使用できるようになることです。データベースを使用すると、テーブルにインデックスを追加して、パフォーマンスを大幅に向上させることができます。

1

コストとリソースについて話す場合、ローカルまたはサーバーでホストされるデータベースからデータをフェッチするよりも、Webサービスを利用する方がコストがかかります。

シナリオでは、XMLファイルデータを介してデータが更新されているかどうかを常に確認する必要があります。もしそうなら、それがいつ起こるかについても調べますか? XMLからデータをフェッチする必要がある期間(たとえば、5分、10分、1時間、1年ごと)

0
Maxood

もちろん、WebページがロードされるたびにそのサイズのXMLファイルを読み取ることは、パフォーマンスのボトルネックになる可能性があります。 XmlDocument型のセッション変数にファイルを保存すると( http://msdn.Microsoft.com/en-us/library/ms178581.aspx を参照)、これは「ユーザーセッションごとに1つの負荷」に減少します。はるかに速いかもしれません。 xpath/xsltクエリ構文を利用すると、SQLに匹敵する柔軟性が得られます。

データベースをキャッシュとして使用することは、データベースプロセスのライブ時間がASP.NET Webページプロセスのライフタイムよりも長い場合にのみ意味があるため、SQLサーバーコンパクトエディションのようなインメモリデータベースを使用することはできません。つまり、Webページプロセスとデータベースプロセスの間にプロセス間通信があり、これがそのソリューションの主要なパフォーマンスリスクになります。ロードされたXMLDocumentのクエリは、完全にインプロセスで実行されます。そのため、データベースを使用して本当に効果がある場合は、それをテストするかどうかしかわかりません。また、データベースソリューションの実行は、キャッシュされたXMLソリューションよりもはるかに遅くなる可能性があります。もちろん、データ量が数百MB以上になると、利用可能なすべてのデータを読み込まないソリューションの方が高速になる場合があります。

免責事項:ASP.NETサイトを自分でプログラミングしたことがないので、そのアーキテクチャの一部を誤解した場合は失礼します。

0
Doc Brown