Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2014 22:27:05

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

Добрый день,
есть база SQLite на 150 млн записей.

Где каждая запись это уникальная строка.
Записи упорядочены в алфавитном порядке.

Базу менять не нужно. Нужно лишь быстро проверять (раз 100 в секунду) есть ли строка в базе или нет.
Это возможно без хранения всей базы в памяти?

Или проще разбить базу на кусочки и создать таблицу диапазонов, например, первые 10000 записей это от ааа до аеж, вторые 10000 записей от аеж до азц и т.д.

С базами ранее не работал.
Спасибо.



Офлайн

#2 Апрель 1, 2014 22:48:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

Первое что надо делать - это просто попробовать что получится при использовании запросов.
А какие характеристики входного потока? будет больше промахов или попаданий? Вам нужно для каждого теста не более 0.01 сек или в среднем не более 0.01? В вашем случае напрашивается оптимизированная Хеш таблица в памяти. Тогда будет существенно быстрее 100 раз в секунду. От разбиения на кусочки ничего не выиграете, базы данных писали умные люди.



Отредактировано doza_and (Апрель 1, 2014 22:59:07)

Офлайн

#3 Апрель 2, 2014 12:46:28

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

DHT
объем sqlite файла какой?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Апрель 2, 2014 14:25:11

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

8,8 Gb



Офлайн

#5 Апрель 2, 2014 14:43:53

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

довольно долго создавалась база

cur.execute('CREATE TABLE names(name TEXT UNIQUE)')
...
...
cur.execute('INSERT INTO names(name) VALUES (?)', (add_name,))

но зато 100 запросов (95% записей отсутствует в базе) обработало потом за 0.7 сек
cur.execute('SELECT * FROM names WHERE name=?', (find_name,))

пользовать можно, но создавалась база больше 3 часов,
commit делал через каждые 100 000 записий.


Возможно ли создавать базу быстрее?
Попробую делать commit каждые 5 000 000 записей, но не уверен, что это особо поможет.



Отредактировано DHT (Апрель 2, 2014 14:53:54)

Офлайн

#6 Апрель 2, 2014 16:28:39

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

ускорил создание базы в 1,5 раза за счет замены одиночной вставки

cur.execute('INSERT INTO names(name) VALUES (?)', (add_name,))

на вставку масива из 100 000 записей
cur.executemany("INSERT INTO names(name) VALUES (?)", add_names)



Офлайн

#7 Апрель 2, 2014 16:55:38

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

Ну и, скорее всего, последний апдейт от меня на сегодня:

скорость создания базы вырастает примерно в 10 раз если добавлять записи заранее отсортированные в алфавитном порядке.


Все устраивает. Вопрос более не актуален.



Офлайн

#8 Апрель 2, 2014 20:54:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

sqlite3 скорость проверки наличия записи

Может если вы этим занимаетесь попробуете еще http://infolab.stanford.edu/~widom/cs145/sqlite/SQLiteLoad.html
Как это будет по времени соотноситься с вашим решением?

DHT
С базами ранее не работал.
Наверное вам стоит посмотреть еще http://www.sqlalchemy.org/. Сырые запросы это не очень хороший стиль.

К размышлению
import numpy as np
import time
nv=150000000
arr=np.random.randint(0,2000000000,nv)
arr.sort()
arr2=np.random.randint(0,2000000000,1000)
t0=time.clock()
res=np.searchsorted(arr,arr2)
t1=time.clock()
print (t1-t0)/1000
>>> 
1.55861955159e-06

Это не самый лучший алгоритм. Если совпадений мало то накопление и проверка хеш кодов строк имеет смысл.



Отредактировано doza_and (Апрель 2, 2014 21:19:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version