Обновление mariadb MEDIUMTEXT COMPRESSED требует дальнейшегоPython

Программы на Python
Ответить
Anonymous
 Обновление mariadb MEDIUMTEXT COMPRESSED требует дальнейшего

Сообщение Anonymous »

Я использую mariadb для хранения файлов HTML и столбец, определенный как MEDIUMTEXET CONPRESSED для HTML, а также некоторые другие столбцы, в которых хранятся ключи INT и VARCHAR. Тем не менее, я столкнулся с довольно странным поведением:
  • Однако, когда я создаю запись с помощью HTML, она слетает.
  • Когда Сначала я создаю запись, а потом добавляю HTML, добавление одного HTML занимает несколько минут (!!!).
Излишне говорить, что HTML - это не индексируется (я не думаю, что это возможно для столбца COMPRESSED). У меня в таблице около 100 000 HTML-файлов. Размер каждого HTML-файла составляет около 150 КБ.
Добавлено:
Вот код

Код: Выделить всё

 loadHTML(self, conn, driver, report=False):

cleaner = Cleaner()
cleaner.javascript = True # This is True because we want to activate the javascript filter
cleaner.style = True      # This is True because we want to activate the styles & stylesheet filter

preport(f"in selLoadHTML for {type(self)}")
cursor = conn.cursor()
try:
self.openMyURL(driver, report=report)
preport(f"opened {self.url}")
the_html = driver.page_source
preport(f"loaded {len(the_html)} bytes")
self.html = cleaner.clean_html(the_html)
preport(f"cleaned {len(self.html)} bytes")
cursor.execute(""" update Page set html=%s, htmlLoaded=NOW(), htmlError=NULL""", (self.html,))
preport(f"updated the database")
except Exception as e:
print(f"Error opening {self.url}, exception {e}")
cursor.execute(""" update Page set htmlError=NOW()""")
conn.commit()
cursor.close()
return
— это оболочка print, которая сообщает время с момента предыдущего отчета.
Вот результат:

Код: Выделить всё

After  0:00:08.334192 ,  opened 
After  0:00:00.049598 ,  loaded 918988 bytes
After  0:00:00.032835 ,  cleaned 43692 bytes
After  0:03:06.277489 ,  updated the database
Как видите, сохранение 43 КБ HTML заняло более 3 минут, который до этого был NULL.
Вот схема (упрощенная )

Код: Выделить всё

CREATE TABLE Page (
url VARCHAR(100) UNIQUE KEY,
html MEDIUMTEXT COMPRESSED,
htmlError DATETIME,
refId int unsigned,
foreign key (refId) references Reference (refId)
В некоторых других случаях я просто заполнял базу данных:

Код: Выделить всё

cur.execute("""INSERT INTO Reference (refId, refText) VALUES (%s, %s) ON DUPLICATE KEY UPDATE refText = %s""", (self.ref_id, self.ref_text, self.ref_text))
cur.execute("""INSERT IGNORE INTO Page (url, html, refId) VALUES (%s, %s, %s) """, (self.url, self.html, self.ref_id))
Данных о производительности у меня нет, но летало - не более нескольких секунд на запись.

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-forether
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»