Мы запускаем процесс python, который запускает эту хранимую процедуру, которая импортирует файлы из определенного каталога в базу данных postgres. Эти файлы сначала импортируются в таблицу в памяти, а затем в таблицу дисков. Фактический размер таблицы в памяти никогда не должен превышать 30 МБ. Поскольку эта таблица постоянно обновляется, размер таблицы увеличивается (из-за мертвых кортежей). Чтобы держать вещи под контролем, нам нужно выполнить операцию CLUSTER на столе. Я использую модуль psycopg2 для запуска хранимой процедуры и CLUSTER таблицы, но если выполняется процесс импорта, размер таблицы никогда не уменьшается. Но если я останавливаю процесс импорта и запускаю CLUSTER, тогда размер таблицы уменьшается. Из-за соображений производительности я должен иметь возможность запускать команду CLUSTER без остановки процедуры импорта.
Я пытался выполнить фиксацию вручную, ISOLATION_LEVEL_AUTOCOMMIT, но ничего из этого не помогло.
Ниже приведен пример кода процесса -
while True:
-get the filenames in directory
for filpath in filenames:
conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
cursor = conn.cursor()
# Calls a postgresql function that reads a file and imports it into
# a table via INSERT statements and DELETEs any records that have the
# same unique key as any of the records in the file.
cursor.execute("SELECT import('%s', '%s');" % (filepath, str(db_timestamp))
conn.commit()
cursor.close()
conn.close()
os.remove(get_media_path(fname))
С аналогичным объектом conn я хочу запускать команду CLUSTER один раз в час -
conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
cursor = conn.cursor()
cursor.execute("CLUSTER table_name")
conn.commit()
cursor.close()
conn.close()
Также я попробовал установить -
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
Другая часть информации -
У меня все это работает в среде Django. Я не мог использовать объекты соединений django для выполнения этой задачи, потому что - django не смог освободить соединения с моим потоковым кодом, и вскоре база данных перестала принимать соединения. Может ли это смешанное окружение повлиять на psycopg?
Несколько наблюдений -
- Запуск команды CLUSTER при запуске процесса импорта - размер не уменьшается
- Когда я прекращаю процесс импорта, а затем запускаю CLUSTER - размер уменьшается
- Когда я прекращаю процесс импорта и запускаю процесс импорта обратно, а после этого запускаю команду CLUSTER - размер уменьшается
Есть мысли по поводу проблемы?