从数据库B向数据库A添加新的非重复记录的最快方法(两者都是巨大的)

2024-04-19 19:09:18 发布

您现在位置:Python中文网/ 问答频道 /正文

有两个sqlite数据库A和B,都由1000多万行组成。任务是读取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

现在,由于这两个数据库太大,无法全部读取到内存中,所以在执行此操作时,我经常遇到MemoryError,实际上,发生这种情况时只使用2G内存,而在我的win 7 64位上总共有16G RAM,所以顺便问一下,有什么想法让python充分利用这一点吗?你知道吗

不管怎样,基本上我必须把数据库B分成几个部分来做这项工作,这是更无效的方式,因为在B中已经有很多重复的,他们最终被分成不同的部分,这是处理每一次比较数据库A,所以有没有更快的方法来做这件事?你知道吗


Tags: 内存nofrom数据库readsqlite记录all
1条回答
网友
1楼 · 发布于 2024-04-19 19:09:18

可以为两个数据库中的有序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()

相关问题 更多 >