Image

Imagedil wrote in Imageru_python

Category:

Кто тормозит - я, sqlite или django? [solved]

Создал в django минимально возможную модель из одного-единственного поля:
foo=models.IntegerField(primary_key=True).
В базе получилось оно самое:
CREATE TABLE "foo_foo" (
    "foo" integer NOT NULL PRIMARY KEY
);

Написал тестовую программку для загрузки данных из файла. Она проверяет, есть ли уже объект с таким значением (Foo.objects.get(foo=...)), если нет - создаёт и сохраняет в базу. При отключённой записи в базу программа летает, но стоит раскомментировать o.save() у свежесозданного объекта - начинаются дикие тормоза, на добавление одной записи уходит порядка секунды.

На чтение работает нормально: если программу прервать и запустить снова, то ранее загруженные записи она находит мгновенно, а на создании новых опять тормозит.

База пустая, там одна-единственная таблица, других приложений в проекте вообще нет. Удалять базу целиком и создавать заново пробовал, не помогает.

Вопрос: это sqlite по жизни такой тормозной, или django с ним как-то криво работает, или это я что-то не так делаю?


Debian squeeze (6.0.3, stable)
python 2.6.6-3+squeeze6
python-django 1.2.3-3+squeeze2
libsqlite3-0 3.7.3-1

Нагрузка на машине никакая. Сама программа потребляет порядка 2% CPU и в основном находится в состоянии D, то бишь, в ожидании завершения ввода-вывода.

Скорость записи на диск сама по себе вполне нормальная:
# dd if=/dev/zero of=1.tmp bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0781606 s, 1.3 GB/s



Upd: проблема была вызвана автокоммитами после каждого save(). Решается использованием декоратора @transaction.commit_manually для функции, внутри которой крутится цикл, и transaction.commit() в конце этой функции.

Но почему автокоммиты занимают столько времени, я всё равно не понимаю.