Сжатие столбца XML в Sqlite с Python ЗАМЕДЛЕННО! - PullRequest
0 голосов
/ 06 июля 2010

Я новичок в Python и Sqlite, так что я уверен, что есть лучший способ сделать это.У меня есть БД с 6000 строк, где 1 столбец является строкой XML 14K.Я хотел сжать все эти строки XML, чтобы уменьшить размер БД.К сожалению, приведенный ниже скрипт намного, намного медленнее, чем эта простая командная строка (которая занимает несколько секунд).

sqlite3 weather.db .dump | gzip -c > backup.gz

Я знаю, что это не то же самое, но он читает / конвертирует БД в тексти запусти gzip.Поэтому я надеялся, что этот сценарий будет работать с 10-кратной производительностью, но он больше работает в 1000 раз медленнее.Есть ли способ сделать следующий скрипт более эффективным? Спасибо .

import zlib, sqlite3

conn = sqlite3.connect(r"weather.db")
r = conn.cursor()
w = conn.cursor()
rows = r.execute("select date,location,xml_data from forecasts")
for row in rows:
    data = zlib.compress(row[2])
    w.execute("update forecasts set xml_data=? where date=? and location=?", (data, row[0], row[1]))

conn.commit()
conn.close()

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

Вы сравниваете яблоки с апельсинами здесь.Большая разница между sqlite3 | gzip и python-версией заключается в том, что последний записывает изменения обратно в БД!

Что sqlite3 | gzip делает:*

gzip текст

в дополнение к вышеприведенной версии python записывает сжатый текст обратно в БД с одним UPDATE для каждой прочитанной записи.

2 голосов
/ 06 июля 2010

Не уверен, что вы можете увеличить производительность, выполнив обновление по факту. между сжатием и обновлением записи слишком много накладных расходов. Вы не получите никакой экономии места, если не будете делать вакуум после того, как закончите с обновлениями. лучшее решение, вероятно, будет делать сжатие, когда записи впервые вставляются. тогда вы получите экономию места и снижение производительности, скорее всего, будет не таким заметным. если вы не можете сделать это на вкладыше, то я думаю, что вы изучили две возможности и увидели результаты.

1 голос
/ 06 июля 2010

Извините, но вы неявно запускаете транзакцию в своем коде? Если вы выполняете автокоммит после каждого ОБНОВЛЕНИЯ, это существенно замедляет работу.

У вас есть соответствующий индекс по дате и / или местоположению? Какие у вас есть вариации в этих столбцах? Можете ли вы использовать в этой таблице первичный ключ с целыми числами с автонумерацией?

Наконец, можете ли вы указать, сколько времени вы тратите на вызовы zlib и сколько на ОБНОВЛЕНИЯ? В дополнение к записи в базу данных, которая замедлит этот процесс, ваша версия базы данных включает в себя 6000 вызовов (с 6000 инициализациями) алгоритма zip.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...