Оптимизация SQLite (Python): поиск дублирующихся записей, а затем объединение ссылочных значений в репрезентативную уникальную запись? - PullRequest
0 голосов
/ 24 апреля 2018

Моя проблема заключается в следующем:

У меня есть список записей в файле, аналогичный именам и адресам в телефонной книге.Этот список неупорядочен, где-то порядка 1-10 миллиардов записей и занимает 500 ГБ на диске.Я хотел бы подсчитать, сколько раз каждое имя представлено в этом файле (то есть сколько дубликатов существует для каждого имени), а затем объединить все известные адреса с этим именем.

Мой первый подход состоял в том, чтобывставьте записи с предложением try / exc и обновите, если необходимо (UPSERT?):

c.execute('CREATE TABLE IF NOT EXISTS MYTable (Name TEXT PRIMARY KEY, Address TEXT) WITHOUT ROWID')
try:
    c.execute(f'INSERT INTO MYTable (Name, Address) VALUES ("{thename}","{theaddress}"')
except sqlite3.IntegrityError:
    c.execute(f'UPDATE MYTable SET Address = Address || "{theaddress}" WHERE Name = "{thename}"')

И это выполнит работу со скоростью около 50 000 строк / с.Тем не менее, я пытаюсь сделать это быстрее, так как создание базы данных с этим подходом займет около 50-60 часов.Я пробовал следующие попытки оптимизации:

  • PRAGMA journal_mode = WAL;незначительный эффект
  • PRAGMA synchrounous = выкл;небольшой эффект
  • начало транзакций / совершение транзакций вручную;небольшой эффект
  • Удаление индекса, использование executemany, добавление индекса обратно, а затем использование быстрого поиска для поиска дубликатов;В ~ 2-4 раза быстрее создать исходную БД, но сохраняет дубликаты до тех пор, пока они не будут проиндексированы, а затем объединены в одно представление (имя: адрес1, адрес2, адрес_n).Также занимает много места на диске.

Есть ли что-то в подходе, который я должен изменить, или в некоторой оптимизации для решения этой проблемы?Спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...