Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 22, 2009 23:19:18

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

Всем привет! Появилась следующая задача: взять текстовый документик весом около 1 гига, распарсить и сделать очень быстрый поиск по нему. Решил использовать файловую базу данных, возможности сатвить сервер БД, к сожалению, нет. Полазил в инете и остановился на 2 вариантах: MySQL и Berkeley DB. Вроде, как обе поддерживают “файловый” вариант. Может кто подскажет, какую лучше, если учесть, что ПО будет на Python под Windows? Заранее спасибо.



Офлайн

#2 Фев. 22, 2009 23:54:29

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Файловые БД

SQlLite.

Офлайн

#3 Фев. 23, 2009 08:05:35

clopomor
От:
Зарегистрирован: 2007-06-12
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

іще може бути Firebird
якщо багато оперативки то можна попробувати Memcached
чи розміщувати документ на диску в оперативці, або ж відображати в пам"ять



Офлайн

#4 Фев. 23, 2009 09:29:31

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

clopomor
іще може бути Firebird
якщо багато оперативки то можна попробувати Memcached
чи розміщувати документ на диску в оперативці, або ж відображати в пам"ять
Нажаль, оперативки небагато :(, але дякую за пораду.

Ferroman
SQlLite.
Как-то я проморгал этот вариант, спасибо большое.



Отредактировано (Фев. 23, 2009 09:30:48)

Офлайн

#5 Фев. 23, 2009 11:49:00

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2256
Репутация: +  40  -
Профиль   Отправить e-mail  

Файловые БД

если простая структура БД то bsddb будет быстрее

Офлайн

#6 Фев. 23, 2009 12:03:37

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

slav0nic
если простая структура БД то bsddb будет быстрее
Структура, действительно, простая, спасибо за совет!



Офлайн

#7 Март 8, 2009 19:06:46

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

Покрутил Berkeley DB и SQlLite. Остановился на SQlLite, так как проще в использовании, как мне показалось. Работает довольно-таки шустро, но застопорился на этапе поиска по базе. А именно: в базе хранятся кириллические данные и латиница - все в utf8. Когда делаю так:

...
qery = "select * from mainTable where useName like '%" + name + "%';"
p = c.execute(qery)
...
то регистр игнорируется только, если name задана латиницей. То есть:
если в таблице есть поле useName, равное ВЛАДИМИР, а name = влад, то запрос не найдет это поле;
если в таблице есть поле useName, равное владимир, а name = влад, то запрос найдет это поле;
если в таблице есть поле useName, равное VLADIMIR, а name = vlad, то запрос найдет это поле;
Не подскажете, в чем может быть проблема или лучше создать отдельную ветку?



Отредактировано (Март 8, 2009 19:08:12)

Офлайн

#8 Март 8, 2009 19:33:03

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Файловые БД

отсюда http://www.sqlite.org/faq.html#q18

Case-insensitive matching of Unicode characters does not work.

The default configuration of SQLite only supports case-insensitive comparisons of ASCII characters. The reason for this is that doing full unicode case-insensitive comparisons and case conversions requires tables and logic that would nearly double the size of the SQLite library. The SQLite developers reason that any application that needs full unicode case support probably already has the necessary tables and functions and so SQLite should not take up space to duplicate this ability.

Instead of providing full unicode case support by default, SQLite provides the ability to link against external unicode comparison and conversion routines. The application can overload the built-in NOCASE collating sequence (using sqlite3_create_collation()) and the built-in like(), upper(), and lower() functions (using sqlite3_create_function()). The SQLite source code includes an “ICU” extension that does these overloads. Or, developers can write their own overloads based on their own unicode-aware comparison routines already contained within their project.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Март 8, 2009 21:21:06

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Файловые БД

PooH
отсюда http://www.sqlite.org/faq.html#q18
Case-insensitive matching of Unicode characters does not work.

The default configuration of SQLite only supports case-insensitive comparisons of ASCII characters. The reason for this is that doing full unicode case-insensitive comparisons and case conversions requires tables and logic that would nearly double the size of the SQLite library. The SQLite developers reason that any application that needs full unicode case support probably already has the necessary tables and functions and so SQLite should not take up space to duplicate this ability.

Instead of providing full unicode case support by default, SQLite provides the ability to link against external unicode comparison and conversion routines. The application can overload the built-in NOCASE collating sequence (using sqlite3_create_collation()) and the built-in like(), upper(), and lower() functions (using sqlite3_create_function()). The SQLite source code includes an “ICU” extension that does these overloads. Or, developers can write their own overloads based on their own unicode-aware comparison routines already contained within their project.
Спасибо, как-то не ожидал даже такого хода событий.
Если я правильно понял, то без учета регистра ищется только текс в ASCII. Если нам надо искать в utf8, то юзаем функции upper() и lower(), которые не работают с русским. Но получается следующая странность: в дополнении к Firefox SQLite Manager все прекрасно ищется именно в той БД, в которой я через питон не могу найти. То есть, делаю так:
select * from mainTable where useName like '%ВлАд%'
и он находит поля.



Офлайн

#10 Март 8, 2009 22:45:17

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Файловые БД

Посмотрите вот здесь http://docs.python.org/library/sqlite3.html#registering-an-adapter-callable
Connection.create_function(name, num_params, func) вроде должна помочь, попробывал бы сам, но уже страшно спать хочу :)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version