0

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

新しいオブジェクトの取り扱いは簡単です。データ ソースは各オブジェクトに連続した ID 番号を与え、新しい情報の先頭の ID 番号をデータベースと照合するだけで完了です。オブジェクトのプロパティの一部が変更された場合、またはオブジェクトが削除された場合など、他のケースに対する提案を探しています。

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

4

4 に答える 4

1

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

交差点についてのあなたの考えに関して...それは逆に行われるべきです!CSVから一時テーブルにすべてのデータをインポートし、2つのSQLデータベーステーブルを交差させる必要があります。OracleまたはMSSQL2008(2005年については不明)を使用する場合、非常に便利なMERGEキーワードが見つかるため、他のプログラミング言語でデータをマージするために費やすよりも少ない労力でSQLを記述できます。

于 2009-06-19T18:33:05.620 に答える
1

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

list_1 が「マスター」(重複なし) であり、list_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_2 をソートされた状態に保つ構造に蓄積できる場合、かなりの時間を節約できます。

冗長で申し訳ありませんが、どのイテレータが を発生させたかを知る必要があるStopIterationため、(自明に) while ループ全体を big-old-try ブロックでラップすることはできません。

于 2009-06-19T19:11:13.027 に答える