6

私が勤務先にいる数年間で、アンチパターンと見なすものへの明確な傾向に気づきました。それは、内部データをXMLの大きな文字列として維持することです。私はこれが多くの異なる方法で行われるのを見てきましたが、2人の最悪の犯罪者は非常に似ていました。

Webサービス

最初のアプリケーションであるWebサービスは、SQLデータベース内の潜在的に大量のデータへのアクセスを提供します。起動時に、データベースから多かれ少なかれすべてのデータを引き出し、XMLとしてメモリに保存します。(3回。)このアプリケーションの所有者は、これをキャッシュと呼びます。私はそれを遅いと呼んでいます。なぜなら、これに対処している間に遭遇したすべてのパフォーマンスの問題は、このことを直接追跡できるからです。(これは企業環境であるため、クライアントがサービスではなくパフォーマンスの失敗のせいにされるのは当然のことです。)このアプリケーションはXMLDOMを使用します。

インポーター

2番目のアプリケーションは、サードパーティのデータベースからのエクスポートの結果として生成されたXMLファイルを読み取ります。目標は、このデータを(私たちが所有する)独自のシステムにインポートすることです。これを実行するアプリケーションは、XMLファイル全体を読み込み、インポートシーケンス全体を通じてXMLファイルのコピーを少なくとも2つ、場合によっては4つ保持します。データは操作、変換、およびインポートが行われる前に構成が行われる可能性があるため、インポーターはこのデータを生涯にわたってXML形式で所有することに注意してください。当然のことながら、このインポーターは、適度なサイズのXMLファイルが提供されると爆発します。このアプリケーションは、そのコピーの1つにのみXML DOMを使用し、残りはすべて生のXML文字列です。

私の常識的な理解では、XMLはデータをメモリ内に保持するのに適した形式ではなく、データを出力/転送するときにXMLに変換し、読み込みおよびインポートするときに内部データ構造に変換する必要があります。重要なのは、スケーラビリティの問題を完全に無視する本番コードに常に遭遇しており、そうするために多大な労力を費やしているということです。(これらのアプリケーションでの文字列解析の膨大な量は恐ろしいものです。)

これは、他の人が失敗した仕事に適切なツールを適用するための一般的な失敗ですか?それとも私の側の運が悪いだけですか?それとも、大量のデータをXMLとしてメモリに保存することが正しく、OKであるという、目がくらむほど明白で良い状況を見逃しているのでしょうか。

4

9 に答える 9

4

メモリに保存されているデータはすべてクラスにある必要があります。私たちが話しているデータの量が多ければ多いほど、これはより重要になります。Xml は、パフォーマンスを低下させる非常に肥大化した形式です。Xml は、アプリケーション間のデータ転送にのみ使用する必要があります。私見では。

于 2009-06-17T17:54:26.707 に答える
2

いいえ、同意します。最初の例では、データベースがほとんどすべてのキャッシュを処理する必要があるため、すべてのデータをプログラム メモリに格納するのは間違っています。これは、XML としてメモリ内に格納されているかどうかに関係なく適用されます。

2 つ目は、できるだけ早く XML を有用な表現 (おそらくデータベース) に変換してから、そのように処理することです。少量のデータの場合にのみ、すべての作業をメモリ内で XmlDocument として実行することが適切です (たとえば、XPath を使用)。文字列の解析は慎重に使用する必要があります。

于 2009-06-17T17:50:54.060 に答える
1

@Matthew Flaschen は素晴らしい点を指摘しています。付け加えておきたいのは、既存のプロジェクトに参加すると、同意できない設計と実装の決定を見つける可能性が高いということです。

私たちは皆、常に新しいことを学び、間違いを犯します。これが「当たり前」のような問題のように思えることには同意しますが、他の開発者がキャッシュの概念を通じてコードを最適化しようとしていたことは確かです。

重要なのは、人々、特に開発者にやり方を変えるように説得するには、穏やかなアプローチが必要になる場合があるということです。これはコーディングの問題ではなく、人の問題です。あなたが提案しているこれらの変更は、彼らが無能であることを意味するものではないことを、これらの開発者に納得させる方法を見つける必要があります。

キャッシングは素晴らしいアイデアであることに同意することをお勧めしますが、機能を高速化するためにキャッシングに取り組みたいと考えています。古い方法と比較して、(より論理的な) 実装がどのように機能するかの簡単なデモを作成します。劇的な速度の向上について議論するのは難しい. 彼らが会話で実装した方法を直接攻撃することには注意してください. これらの人々があなたと一緒に働く必要があります。

幸運を!

于 2009-06-17T18:01:11.563 に答える
0

一般に、XML でのシリアル化に依存しない内部データ モデルを使用しようとします。

ただし、私の意見では、内部データ構造として XML を使用することが理にかなっているケースが 1 つあります。データ モデルが、サード パーティによってフォーマットを拡張できる階層関係をキャプチャする必要がある場合、およびアプリケーションが拡張を維持しながらこのデータを転送する必要がある場合です。情報。

木こりのロギング フレームワークを例にとると、すべてのアプリケーションがイベントに関する階層的な情報 (警告、エラーなど) を提供できる XML ベースのイベント データ モデルを使用するという考え方です。フレームワークは、イベントの収集と適切なハンドラーへの配布を処理します。サードパーティは、フォーマットへの独自の追加を簡単に定義し、適切なジェネレーターとハンドラーを提供できます。

ここで重要なのは、フレームワークがすべての XML 情報をそのままの状態で XML をジェネレーターからハンドラーに転送する必要があるということです。この場合、必要なすべての情報を取得する内部データ構造を実装すると、XML 自体のほとんどが再実装されます。したがって、内部データ表現に適切な DOM フレームワークを使用することは理にかなっています。

于 2012-07-20T10:41:11.117 に答える
0

大量のデータの場合、答えはノーです。データを直接 XML 文字列としてメモリに格納する正当な理由はありません。

ただし、より効率的な方法で XML をメモリに保持する方法について、Alex Brown による興味深いプレゼンテーションがあります。「フローズン ストリーム」として。

このビデオや、XML プラハ 2009 で行われたその他のプレゼンテーションもここにあります

リンクテキスト

于 2009-06-17T18:19:22.390 に答える
0

私もそう思いますし、不運の要素もあると思います。

...しかし、ストローをつかむと、XML として保存されているデータの唯一の用途は、XML がテスト データを簡単にモックアップする方法を提供する自動化された単体テストです。ただし、それだけの価値はありません。

于 2009-06-17T17:58:34.657 に答える
0

レガシ COM オブジェクトとやり取りするには、これを行う必要があることがわかりました。COM オブジェクトは、xml またはクラスのいずれかを取ることができます。クラスの各メンバーを満たすための相互運用のオーバーヘッドが大きすぎたため、xml を処理する方がはるかに高速でした。ac# クラスを COM クラスと同一にすることもできましたが、時間枠内で行うのは非常に困難でした。xml でした。それが良い設計上の決定であるというわけではありませんが、巨大なデータ構造の相互運用を扱う場合、これは私たちができる最速の方法でした.

C# 側で LinqtoXML を使用しているため、操作が少し簡単になります。

于 2009-06-17T17:58:36.667 に答える