Моя проблема заключается в следующем:
У меня есть список записей в файле, аналогичный именам и адресам в телефонной книге.Этот список неупорядочен, где-то порядка 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).Также занимает много места на диске.
Есть ли что-то в подходе, который я должен изменить, или в некоторой оптимизации для решения этой проблемы?Спасибо за любую помощь!