Форум сайта python.su
Всем привет! Появилась следующая задача: взять текстовый документик весом около 1 гига, распарсить и сделать очень быстрый поиск по нему. Решил использовать файловую базу данных, возможности сатвить сервер БД, к сожалению, нет. Полазил в инете и остановился на 2 вариантах: MySQL и Berkeley DB. Вроде, как обе поддерживают “файловый” вариант. Может кто подскажет, какую лучше, если учесть, что ПО будет на Python под Windows? Заранее спасибо.
Офлайн
SQlLite.
Офлайн
іще може бути Firebird
якщо багато оперативки то можна попробувати Memcached
чи розміщувати документ на диску в оперативці, або ж відображати в пам"ять
Офлайн
clopomorНажаль, оперативки небагато :(, але дякую за пораду.
іще може бути Firebird
якщо багато оперативки то можна попробувати Memcached
чи розміщувати документ на диску в оперативці, або ж відображати в пам"ять
FerromanКак-то я проморгал этот вариант, спасибо большое.
SQlLite.
Отредактировано (Фев. 23, 2009 09:30:48)
Офлайн
если простая структура БД то bsddb будет быстрее
Офлайн
slav0nicСтруктура, действительно, простая, спасибо за совет!
если простая структура БД то bsddb будет быстрее
Офлайн
Покрутил Berkeley DB и SQlLite. Остановился на SQlLite, так как проще в использовании, как мне показалось. Работает довольно-таки шустро, но застопорился на этапе поиска по базе. А именно: в базе хранятся кириллические данные и латиница - все в utf8. Когда делаю так:
...
qery = "select * from mainTable where useName like '%" + name + "%';"
p = c.execute(qery)
...
Отредактировано (Март 8, 2009 19:08:12)
Офлайн
отсюда 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.
Офлайн
PooHСпасибо, как-то не ожидал даже такого хода событий.
отсюда http://www.sqlite.org/faq.html#q18Case-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.
select * from mainTable where useName like '%ВлАд%'
Офлайн
Посмотрите вот здесь http://docs.python.org/library/sqlite3.html#registering-an-adapter-callable
Connection.create_function(name, num_params, func) вроде должна помочь, попробывал бы сам, но уже страшно спать хочу :)
Офлайн