Найти - Пользователи
Полная версия: sqlite3 скорость проверки наличия записи
Начало » Базы данных » sqlite3 скорость проверки наличия записи
1
DHT
Добрый день,
есть база SQLite на 150 млн записей.

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

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

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

С базами ранее не работал.
Спасибо.
doza_and
Первое что надо делать - это просто попробовать что получится при использовании запросов.
А какие характеристики входного потока? будет больше промахов или попаданий? Вам нужно для каждого теста не более 0.01 сек или в среднем не более 0.01? В вашем случае напрашивается оптимизированная Хеш таблица в памяти. Тогда будет существенно быстрее 100 раз в секунду. От разбиения на кусочки ничего не выиграете, базы данных писали умные люди.
JOHN_16
DHT
объем sqlite файла какой?
DHT
8,8 Gb
DHT
довольно долго создавалась база
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
ускорил создание базы в 1,5 раза за счет замены одиночной вставки
cur.execute('INSERT INTO names(name) VALUES (?)', (add_name,))

на вставку масива из 100 000 записей
cur.executemany("INSERT INTO names(name) VALUES (?)", add_names)
DHT
Ну и, скорее всего, последний апдейт от меня на сегодня:

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


Все устраивает. Вопрос более не актуален.
doza_and
Может если вы этим занимаетесь попробуете еще 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

Это не самый лучший алгоритм. Если совпадений мало то накопление и проверка хеш кодов строк имеет смысл.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB