Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2009 21:55:45

u4upy
От:
Зарегистрирован: 2009-05-25
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLite на Windows

В “Rapid GUI Programming with Python and Qt” Саммерфильда в главе про СУБД прочитал: "…these applications are run for the very first time they create a database of fake records which they then use on subsequent runs. Generating these records using Qt’s built-in SQLite is fast on Linux but very slow on some Windows machines." Это про программку, создающую небольшую демо-базу, обыкновенными INSERT'ами, вроде бы. Так и есть, на ~100 записей секунд 15-20 уходит.

Вопрос: а почему очень медленно под Windows? sqlite для Windows какой-то неполноценный штоле? А?



Офлайн

#2 Окт. 20, 2009 22:47:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLite на Windows

inserts в одну транзакцию класть не пробовали?



Офлайн

#3 Окт. 21, 2009 01:50:41

u4upy
От:
Зарегистрирован: 2009-05-25
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLite на Windows

Андрей Светлов
inserts в одну транзакцию класть не пробовали?
Не пробовал, но вопрос не в том. Почему отдельные то insert'ы медленнее на винде? В этой книжке аж 2 раза сообщается, как само собой разумеющееся: вот, сейчас мы запишем несколько строк в sqlite табличку, но имейте в виду, что на линуксе это будет быстро, а вот на некоторых windows системах это будет очень медленно. И действительно, запускаю этот же пример (assetmanager.py) на убунте, даже для 100 записей разница в скорости заметна, и замерять не надо. Но почему? На сайте sqlite роюсь, ну ни слова там про то, что виндовый порт какой то особенный, “медленный”.

Примеры вот здесь можно взять http://www.qtrac.eu/pyqtbook.html



Отредактировано (Окт. 21, 2009 02:09:10)

Офлайн

#4 Окт. 21, 2009 02:56:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLite на Windows

Не знаю, что и почему у вас медленно.

import os
import sqlite3

os.unlink('example.db')

conn = sqlite3.connect('example.db')
conn.execute('''create table t (id int, txt text)''')
conn.commit()


c = conn.cursor()
import time
t1 = time.time()

for i in xrange(10000):
c.execute('insert into t (id, txt) values (%d, %r)' % (i, i))

conn.commit()

print time.time() - t1

conn.close()
10,000 вставок за 0.2 секунды на Windows - это как, приемлимо? Python 2.5, sqlite стандартный - который в поставке.

С базами данных из Qt никогда не работал - не вижу смысла.



Офлайн

#5 Окт. 21, 2009 11:57:04

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

SQLite на Windows

Вообще то очень много зависит от файловой системы. Пробовал на Фат32 и НТФС разница между ними несколько десятков секунд, в пользу НТФС, при вставке 10 000 записей и в 100 полей:)

Офлайн

#6 Окт. 21, 2009 12:27:52

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

SQLite на Windows

u4upy
Но почему?
Потому что большие норвежские тролли не любят виндовс. И правильно делают.



Офлайн

#7 Окт. 21, 2009 20:44:38

u4upy
От:
Зарегистрирован: 2009-05-25
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLite на Windows

Как поменять название темы? SQLite совсем невиноватый оказался. Хочу переименовать тему на “Qt, медленный и лживый”, но не знаю как.

import os
import time
import sys
from PyQt4.QtSql import *
from PyQt4.QtGui import *

filename = "db"
if os.path.exists(filename):
os.unlink(filename)

app = QApplication(sys.argv) #?
db = QSqlDatabase.addDatabase("QSQLITE")
print db.lastError().text()
db.setDatabaseName(filename)
db.open()

q = QSqlQuery()

q.exec_("""CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
number INTEGER NOT NULL)""")

t = time.time()
for i in xrange(100):
q.exec_("INSERT INTO test (number) VALUES ('%s')" % i)
print time.time() - t

q.clear()
db.close()
Windows: ~10 секунд
Kubuntu: ~1 секунда
Это всего лишь 100 записей. А то же самое, но без Qt (код товарища Светлова, см. выше): 100 000 записей за ~2.7 секунды. И там и там, на одной машине.

Книшку зжог, сижу и плачу.

Вот нахрена называть свой продукт кроссплатформенным, когда разница в производительности между портами отличается на порядок? Вот нахрена товариш Саммерфильд в главах 14-16 распинается, какой Qt замечательный для СУБД? Вот нахрена сдались их особые MVC, виджеты заточенные, когда без их заточенностей и замечательностей быстрее выходит в разы? Сатанизм какой-то. Ужасное, ужасное разочарование. А в Nokia то и не знают. Купили, лошары.

Побочный вопрос. Для чего эта строка?
app = QApplication(sys.argv)
Без нее после
db = QSqlDatabase.addDatabase("QSQLITE")
получим ‘Driver not loaded’.

Это почему и зачем, а? Что такое?



Офлайн

#8 Окт. 21, 2009 21:15:11

u4upy
От:
Зарегистрирован: 2009-05-25
Сообщения: 78
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLite на Windows

ZZZ
u4upy
Но почему?
Потому что большие норвежские тролли не любят виндовс. И правильно делают.
Ваша реплика ценна?


Тема о соответствии ПО тому, что у него в фичах прописано. Например кроссплатформенность. Когда одно и то же в разных средах одинаково работает. И при чем здесь любовь? И что тут правильного? А?



Офлайн

#9 Окт. 21, 2009 22:10:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLite на Windows

u4upy
У меня на Висте SP1, NTFS ваш код занимал полсекунды-секунду. Тоже не фонтан, но все не настолько плохо.
QApplication нужен прежде всего для того, чтобы работали слоты/сигналы. Не нужны GUI - используйте QtCore.QCoreApplication.

Вообще-то Qt - это “вещь в себе”. За что недолюбливаю - а деваться некуда. Там все свое - и xml, и сокеты. Последнее особенно доставляет.
Большая часть PyQt кода, который я видел - использовала GUI и успешно забивала на все остальные чудеса. У Питона есть вполне достаточно “родных” средств для сетевых коммуникаций, например.



Офлайн

#10 Окт. 21, 2009 22:22:50

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

SQLite на Windows

u4upy
Ваша реплика ценна?
Там кажется улыбка…

u4upy
Тема о соответствии ПО тому, что у него в фичах прописано. Например кроссплатформенность. Когда одно и то же в разных средах одинаково работает. И при чем здесь любовь? И что тут правильного? А?
Дело в том, что кроссплатформенность, понятие очень относительное. На самом деле кроссплатформенных программ нет. И никогда не было. Например посмотрите на работу такой программы:
print 'Здравствуй мир!'
Даже под разными дистрами линухи, она будет работать по-разному.
И это даже не совсем шутка, хотя улыбнуться всё-таки можно.

С Qt я работаю уже довольно долго и знаю, что реальные проблемы кроссплатформенности есть. Но это всё-равно лучший на сегодня вариант. Поверьте, 99.931% кода, использующего PyQt4, не нуждается в правке при запуске на другой платформе. Оно просто работает. Так что это не тема для возмущения.

Что касается sqlite, то юзайте питоний модуль и будет вам счастье. Просто рисуйте модель (от QAbstractModel) и подключайте её к отображению. Или запользуйте алхимию – замечательно ложиться на модель qt.

u4upy
Windows: ~10 секунд
Kubuntu: ~1 секунда
Это всего лишь 100 записей.
Хм… А транзакцию руками открыть не пробовали?
См. QSqlDatabase.transaction и QSqlDatabase.commit.

u4upy
получим ‘Driver not loaded’.
Правильно. Драйвера БД, как и прочие плагины, подгружаются при создании QtCore.QCoreApplication, дитятькой которого и является QtGui.QApplication.


Андрей Светлов
Там все свое - и xml, и сокеты. Последнее особенно доставляет.
При всей моей любви к Qt, полностью согласен. Но он всё-таки не для питона написан. Для си_с_плюшками оно удобно.
А на питоне, в общем, только гуйню от туда и юзать. За очень редким исключением… Собственно иногда QSql использую. Но редко.



Отредактировано (Окт. 21, 2009 22:29:36)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version