2

2 つの sqlite データベース A と B があり、どちらも 1,000 万行以上で構成されています。タスクは、B のすべてのレコードを読み取り、それらの新しいレコードがまだ A に存在しない場合はそれらを A に追加することです。

A には重複はありませんが、B には多数の重複があります。

A と B の両方が約 100 万行しかないときから、これはトリッキーな仕事であることがわかりました。

list_from_A = read all rows into a list from database A
list_from_B = read all rows into a list from database B

no_dupe_list = list(set(list_from_A) - set(list_from_B))

append no_dupe_list into database A

現在、これら 2 つのデータベースは大きすぎてすべてをメモリに読み込むことができないため、これを行っているときに常に MemoryError に遭遇しました。実際、これが発生したときに使用されるメモリは 2G だけですが、私の win 7 64 ビットには合計で 16G の RAM があるため、ところで、Python がこれを最大限に活用できるようにするためのアイデアはありますか?

とにかく、基本的に私は仕事をするためにデータベースBをいくつかの部分に分割する必要があります.Bにはすでに多くの重複があり、データベースAと比較するたびに処理される異なる部分に分割されるため、これはより効果的ではありません. 、これを行うためのより速い方法はありますか?

4

1 に答える 1

0

両方のデータベースで順序付けられた SELECT のカーソルを作成し、(マージ ソートのように) カーソル レコードを「並行」してデータベース A に不足している行を挿入することができます。カーソルを混乱させるため、メモリを使用する必要はありません (2 行を除く)。

お気に入り:

ca = db_a.cursor("SELECT ....")
cb = db_b.cursor("SELECT ....")
ra = ca.fetch_row()
rb = cb.fetch_row()
while ra and rb:
  if ra <= rb:
    last_row_in_new_A = ra
    ra = ca.fetch_row()
  else:  # rb < ra
    if rb != last_row_in_new_A:  # Removes possible duplicates
      insert row rb
      last_row_in_A = rb
    rb = cb.fetch_row()
# Insert remaining rows from B
while rb:
  if rb != last_row_in_new_A:
    insert row rb
    last_row_in_new_A = rb
  rb = cb.fetch_row()
于 2013-04-26T10:58:41.907 に答える