Мы запускаем процесс 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 - размер уменьшается
Есть мысли по проблеме?