У меня есть база данных 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
Это намного лучше, но все же не очень быстро, это займет 50 часов, чтобы сделать это 1000 раз. Вероятно, придется также более внимательно изучить функции сопряжения
Перебираясь с режимами PRAGMA, я получаю 88,3 с:
cur.execute('pragma journal_mode= WAL;')
- Это приводит к 32,33 с:
cur.execute('pragma cache_size= 3000')
cur.execute(' pragma mmap_size = 256000000')
Есть ли какой-нибудь разумный способ сделать это еще быстрее?