2

有两个 sqlite 数据库 A 和 B,都包含 10+ 百万行。任务是读取 B 中的所有记录并将这些新记录添加到 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

现在由于这两个数据库太大而无法全部读入内存,所以我在执行此操作时经常遇到 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 回答