-1

株式相場で xml フィードを解析し、結果をデータベースに保存するコンポーネントを作成しています。フィードをインクリメンタルに読み取ることができないことを除けば、問題はかなり単純です。つまり、最後の X 回の見積もりの​​変更のみが必要なのか、X 分よりも新しい変更のみが必要なのかを指定する方法はありません。本当の問題は、フィードが愚かで、プロバイダーが修正する必要があることですが、それはオプションの atm ではありません。

フィードは、プロバイダーの最新の株価情報 100000 件を含む巨大な xml ファイルです。フィードは 1 分ごとに 1 回ポーリングされ、その間に約 50 ~ 100 件の変更された見積もりがあります。残りは、何度も何度も読まれる重複した引用です。

フィードの各ポーリング中に、すべての引用符を (lxml を使用して) オブジェクトに解析します。次に、引用オブジェクトごとに、引用がデータベースに既に存在するかどうかを確認します。ある場合は破棄し、ない場合は保存します。新しいデータは約 0.1% のみで、残りは重複しているため、この手順は非常に無駄です。少し最適化するために、過去 X 時間に更新された相場をデータベースに 1 回照会してルックアップ テーブルを作成します。引用符は (last_update, stock_id) キーのデータベース内で一意であるため、この最適化によりクエリの数が約 50% 削減されます。

しかし、まだ 50k db のクエリがあり、各引用符が存在するかどうかを個別にチェックする必要があり、データベースに非常に負担がかかります。

そこで私が探しているのは、フィード パーサーを高速化する方法についてのアイデアです。最後に取得したxmlファイルと新しいxmlファイルを比較する方法はあるのでしょうか?

4

2 に答える 2

1

問題は2つの領域に分けられます。1)解析する必要のないものの解析を回避する方法と、2)どちらも不要なデータベース操作を回避する方法です。

引用符自体が非常に小さい場合は、(1)を解こうとしてもあまり利益が得られない可能性があります。それ以外の場合は、(たとえば、XSLTまたはSAXを使用して)フィルターを作成して、気にしない引用符を破棄し、残りの部分で完全なDOM解析を実行できます。

(2)を解決するには、XMLファイルの差分は一般に注意が必要です。これは、一部のプロバイダーでは一般的すぎるXMLドキュメントの空白の変更により誤検知が発生する可能性があり、実際のXML構造を分析するものが必要になるためです。単純なテキストの行ごとの差分ではありません。これが問題にならない場合は、いくつかのStack Overflowトピックを調べることができますが、特にオープンソースの分野では、XML差分がまだ少し厄介な領域であることも示していると思います。

動作する可能性のある別のアプローチは、ローカルまたは分散メモリのキャッシュを使用して、すでに更新されているものをすばやく検索することです。コンテンツをフィルタリングまたは差分する必要がないという利点があります。また、長期的なインフラストラクチャを構築している場合は、キャッシュインフラストラクチャを他のユースケースに容易に適合させることができる場合があります。OTOH、スケーラブルな分散キャッシングインフラストラクチャを作成することは、特に安価なソリューションではありません。

于 2011-04-01T09:03:31.010 に答える
1

最新のアイテムはフィードの一番上または一番下にありますか? それらが一番​​上にある場合は、データベースに既に存在する最初のアイテムを見たときに解析を停止できます。

最新のアイテムが最後に来る場合は、引用キーをキャッシュし、それらをメモリ内で検索して、キャッシュされていないアイテムに到達したらデータベースのヒットを開始できます。または、データベースに入力した最後の引用を覚えていて、すべてのアイテムを解析するときにそれを探して、それ以降のアイテムのみをデータベースにヒットさせることもできます。

于 2011-04-01T08:50:18.370 に答える