Форум сайта python.su
Добрый день,
есть база SQLite на 150 млн записей.
Где каждая запись это уникальная строка.
Записи упорядочены в алфавитном порядке.
Базу менять не нужно. Нужно лишь быстро проверять (раз 100 в секунду) есть ли строка в базе или нет.
Это возможно без хранения всей базы в памяти?
Или проще разбить базу на кусочки и создать таблицу диапазонов, например, первые 10000 записей это от ааа до аеж, вторые 10000 записей от аеж до азц и т.д.
С базами ранее не работал.
Спасибо.
Офлайн
Первое что надо делать - это просто попробовать что получится при использовании запросов.
А какие характеристики входного потока? будет больше промахов или попаданий? Вам нужно для каждого теста не более 0.01 сек или в среднем не более 0.01? В вашем случае напрашивается оптимизированная Хеш таблица в памяти. Тогда будет существенно быстрее 100 раз в секунду. От разбиения на кусочки ничего не выиграете, базы данных писали умные люди.
Отредактировано doza_and (Апрель 1, 2014 22:59:07)
Офлайн
DHT
объем sqlite файла какой?
Офлайн
8,8 Gb
Офлайн
довольно долго создавалась база
cur.execute('CREATE TABLE names(name TEXT UNIQUE)') ... ... cur.execute('INSERT INTO names(name) VALUES (?)', (add_name,))
cur.execute('SELECT * FROM names WHERE name=?', (find_name,))
Отредактировано DHT (Апрель 2, 2014 14:53:54)
Офлайн
ускорил создание базы в 1,5 раза за счет замены одиночной вставки
cur.execute('INSERT INTO names(name) VALUES (?)', (add_name,))
cur.executemany("INSERT INTO names(name) VALUES (?)", add_names)
Офлайн
Ну и, скорее всего, последний апдейт от меня на сегодня:
скорость создания базы вырастает примерно в 10 раз если добавлять записи заранее отсортированные в алфавитном порядке.
Все устраивает. Вопрос более не актуален.
Офлайн
Может если вы этим занимаетесь попробуете еще 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)
Офлайн