Быстрое обновление базы данных SQLite - PullRequest
1 голос
/ 04 марта 2020

У меня есть база данных SQLite следующего формата:

----------------------------
| id  |Type0 | Type1 | ...     
----------------------------
| id0 | 0-0  |  0-1  | ...
----------------------------
| id1 | 0-1  |  1-1  | ...
----------------------------
  • В настоящее время у меня есть o (10 ^ 8) строк.
  • Следовательно, каждый раз, когда я создаю новый столбец, мне нужно обновить o (10 ^ 8) значений.
  • Я делаю следующее внутри long для l oop:
value = f'{i}-{j}'
id_column = 'id'
id_value = f'id{i}'
update_sql = """ UPDATE {}  SET {} = '{}' where {} = '{}'""".format(table_name, column_name,value, id_column,id_value)
cur.execute(update_sql)
  • Это занимает около 30 минут.
  • Как воспользоваться преимуществами универсального c характера записей для более быстрой инициализации новых столбцов?
  • I может сгенерировать np.array формы (10 000 000,1) менее чем за 1 с, который имеет порядок. Почему я не могу сгенерировать столбец за это время с расположением записей в таблице?
  • Я читаю Повышение производительности SQLite по INSERT в секунду? и транзакции кажутся хорошим способом чтобы ускорить обновления, однако я не знаю, как их структурировать для sqlite3.

ОБНОВЛЕНИЕ: 1. Следующее занимает всего 7 с:

a = range(0,10000000)
b = [0]
c = [f'{x}-{y}' for x in a for y in b]
Следующее занимает только 2,84 с, где Jit является декоратором numba:
@jit(nopython = True)
def go_fast(j):
    a = np.linspace(0,10000000,10000001)
    c = []
    for i in range(0, len(a)):
        c.append((a[i],j))
    return c
Если создание таких объектов во время выполнения происходит так быстро, почему я не могу получить аналогичную производительность для SQL?

Ищите что-то вроде этого сейчас:

listing = fast_list.go_fast(j)
update_sql =" #Some statement to update the column to entries of listing"
cur.execute(update_sql)
Следующий метод занимает всего 185 с, поэтому на порядок лучше. id2 - номер строки
UPDATE table_name SET column_name = id2+j
  1. Это намного лучше, но все же не очень быстро, это займет 50 часов, чтобы сделать это 1000 раз. Вероятно, придется также более внимательно изучить функции сопряжения

  2. Перебираясь с режимами PRAGMA, я получаю 88,3 с:

cur.execute('pragma journal_mode= WAL;')
  1. Это приводит к 32,33 с:
cur.execute('pragma cache_size= 3000')
cur.execute(' pragma mmap_size = 256000000')
Есть ли какой-нибудь разумный способ сделать это еще быстрее?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...