3

私たちが取引している会社は、約 900,000 の製品リストを含む 1.2 GB の CSV ファイルを毎日私たちに提供したいと考えています。ファイルのごく一部のみが毎日変更され、おそらく 0.5% 未満であり、実際には製品が追加または削除されているだけであり、変更されていません。製品リストをパートナーに表示する必要があります。

これをさらに複雑にしているのは、パートナーが郵便番号から半径 30 ~ 500 マイル以内にある製品リストのみを表示できるようにする必要があることです。各製品リストの行には、製品の実際の半径を表すフィールドがあります (30 だけのもの、500 のもの、100 のものなどがあります。500 が最大です)。特定の郵便番号のパートナーは、結果が 20 件ほどしかない可能性が高く、未使用のデータが大量にあることを意味します。すべてのパートナーの郵便番号が事前にわかるわけではありません。

パフォーマンスを考慮しなければならないので、これについてどうするのが最善の方法かわかりません。

2 つのデータベースを用意する必要があります。1 つは郵便番号と緯度/経度を含み、Haversine 式を使用して距離を計算し、もう 1 つは実際の製品データベースを使用する必要があります。その後、どうすればよいでしょうか? 指定された半径内のすべての郵便番号を返し、製品データベースで一致するものを探しますか? 半径 500 マイルの場合、大量の郵便番号になります。または、MySQL 関数を記述しますか?

Amazon SimpleDB を使用してデータベースを保存することもできますが、それでも郵便番号に問題があります。Amazon が呼んでいるように、製品用と郵便番号用の 2 つの「ドメイン」を作成できますか? ただし、複数の SimpleDB ドメインにまたがるクエリを作成できるとは思いません。少なくとも、私は彼らのドキュメントのどこにもそれを見ません。

私は他の解決策を完全に受け入れています。PHP/MySQL または SimpleDB である必要はありません。専用サーバーは 2 GB の P4 であることに注意してください。RAM をアップグレードすることはできますが、これでは大量の処理能力を投入することはできません。または、1.2 GB の CSV の処理中に VPS が耐えられないほど遅かったとしても、問題にならない場所に毎晩 VPS でデータベースを保存して処理することさえできます。デスクトップ コンピューターでファイルをオフラインで処理し、データベースをリモートで毎日更新することもできますが、郵便番号と製品リストを相互参照する必要があるという問題はまだあります。

4

2 に答える 2

2

PostgreSQL とPostgisを調べてみてください。MyISAM を使用する必要なく、MySQL空間インデックス作成機能と同様の機能を備えています(私の経験では、InnoDB とは対照的に破損する傾向があります)。

特に Postgres 9.1 では、GIST インデックスを使用したk 最近傍検索クエリが可能です。

于 2011-06-07T21:27:46.253 に答える
1

うーん、実に興味深い問題です。

これは、実際には 2 つの問題のように思えます。1 つはデータベースのインデックスを作成する方法であり、もう 1 つはデータベースを最新の状態に保つ方法です。説明どおりに最初に達成できますが、郵便番号の保存方法によっては、正規化が問題になる場合と問題にならない場合があります。これは主に、データがどのように見えるかにかかっています。

2 つ目に関しては、これは私の専門分野です。クライアントに現在の csv をアップロードしてもらい、昨日のコピーを保持して diff ユーティリティで実行するか、Perl、PHP、Python、Bash、またはその他のツールを利用して、変更された行を見つけます。それらをデータベースを更新する 2 番目のブロックに渡します。私はこの線に沿った問題を抱えたクライアントに対処してきましたが、それをスクリプト化することが最善の選択である傾向があります. いつでも利用できるスクリプトの編成についてサポートが必要な場合。

于 2011-06-07T21:37:10.063 に答える