2009-06-19 12 views
0

オブジェクトとそのプロパティのリスト(CSVファイルですが、それは問題ではありません)を提供するデータソースがあります。プログラムが実行されるたびに、オブジェクトのリストの新しいコピーを取得し、データベースに格納されているオブジェクト(およびそのプロパティ)のリストと比較し、必要に応じてデータベースを更新する必要があります。リストからリストを更新するアルゴリズム

新しいオブジェクトを扱うのは簡単です。データソースは各オブジェクトに順次ID番号を与え、新しい情報の一番上のID番号をデータベースと照合して完了します。私は、オブジェクトのプロパティのいくつかが変更されたとき、またはオブジェクトが削除されたときの他のケースの提案を探しています。

純粋な解決策は、すべてのオブジェクトをデータベースから取り出し、2つのセット(古いものと新しいもの)の交点の補集合を得て、それらの結果を調べることですが、それはあまり効率的ではないようですセットが大きくなる場合。何か案は?

+2

オブジェクトごとにハッシュを計算して保存しますか? – FogleBird

答えて

1

莫大なデータの標準的なアプローチはこれに相当します。

リスト1は「マスター」(重複なし)であり、リスト2は重複している可能性がある「更新」です。

iter_1 = iter(sorted(list_1)) # Essentially SELECT...ORDER BY 
iter_2 = iter(sorted(list_2)) 
eof_1 = False 
eof_2 = False 
try: 
    item_1 = iter_1.next() 
except StopIteration: 
    eof_1= True 
try: 
    item_2 = iter_2.next() 
except StopIteration: 
    eof_2= True 
while not eof_1 and not eof_2: 
    if item_1 == item_2: 
     # do your update to create the new master list. 
     try: 
      item_2 = iter_2.next() 
     except StopIteration: 
      eof_2= True 
    elif item_1 < item_2: 
     try: 
      item_1 = iter_1.next() 
     except StopIteration: 
      eof_1= True 
    elif item_2 < item_1: 
     # Do your insert to create the new master list. 
     try: 
      item_2 = iter_2.next() 
     except StopIteration: 
      eof_2= True 
assert eof_1 or eof_2 
if eof_1: 
    # item_2 and the rest of list_2 are inserts. 
elif eof_2: 
    pass 
else: 
    raise Error("What!?!?") 

はい、潜在的な並べ替えが含まれます。 list_1をファイルシステムに書き戻すときにlist_1をソート順に保持すると、かなりの時間が節約されます。 list_2をソートしたままの構造体に蓄積することができれば、かなりの時間を節約できます。

申し訳ありませんが、どのイテレータがStopIterationを発生させたのかを知る必要があるため、ビッグトライアルブロックでループ全体をラップすることはできません。

1

「最後に変更された」フィールドを維持する方法はありませんか?これは、あなたが実際に探しているようなものです。前回のバックアップに基づいた増分バックアップが、前回のオブジェクトの変更/削除(/追加)と比較して実行されました。

+0

または変更されたフィールドも素晴らしいでしょう! –

+0

それはありますが、私は悲しいことにCSVデータソースを変更する能力を持っていません... – Dan

0

リストをプログラムにプルすると、ObjectNameのようなリストからオブジェクトの同じプロパティにマップされるデータベーステーブルの列プロパティに基づいてクエリを実行するリストを繰り返し処理します。または、テーブル全体をリストにロードし、そのようにリストを比較することもできます。私はあなたがデータベースが割り当てるIDのほかに存在するオブジェクトについてユニークな何かを持っていると仮定します。

このオブジェクトがクエリでテーブルに見つからない場合は、新しいエントリを作成します。上記のようなFogleBirdが見つかった場合は、そのオブジェクトの計算されたハッシュまたはCRCをテーブルに格納して、リスト内のオブジェクトと比較できるようにします(オブジェクトの計算を実行します)。ハッシュが一致しない場合は、そのオブジェクトをリストのオブジェクトで更新します。

1

データベースとCSVファイルの両方にタイムスタンプが必要です。タイムスタンプは、レコードが更新されたときにデータを表示し、レコードのタイムスタンプを同じIDと比較して更新する必要があるかどうかを判断する必要があります。

交差点についての考え方... これは、 ! CSVからすべてのデータをテンポラリテーブルにインポートし、2つのSQLデータベーステーブルの交点を作成する必要があります。 OracleまたはMS SQL 2008(2005年はわからない)を使用すると、非常に便利なMERGEキーワードが見つかるので、他のプログラミング言語でデータをマージするために費やす労力を軽減してSQLを書くことができます。

関連する問題