Стандартный подход для огромных куч данных сводится к этому.
Предположим, что 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 в большой старый блок try.