2017-01-25 6 views
1

Когда postgres запускает рекурсивный запрос, он создает временную таблицу для него. После завершения запроса временная таблица остается на диске, пока вся программа не конкурирует.Как очистить postgres временные таблицы рекурсивного запроса от django/psycopg2

Программа состоит из основного процесса и многопроцессорного пула рабочих, все с отдельными соединениями db (и я не могу закрыть соединение основного процесса, поскольку он содержит итерирующий источник данных).

Я хотел бы заставить postgres очистить эти временные таблицы после каждого запроса, потому что огромное количество данных.

Запросы выполняются в следующем виде:

def process_datum(datum): 
    with db.connections['world'].cursor() as cursor: 
     cursor.execute("SELECT ... from query_function(%s)", (datum.id,)) 
     rows = cursor.fetchall() 
    for row in rows: 
     try: 
      ... 
      A_Model.objects.create(...) 
     except db.IntegrityError as e: 
      logger.warning("%s: %s", path, e) 

process_datum вызывается из рабочих, query_function является база данных на стороне таблицы функции реализации рекурсивного запроса.

PS Основные запросы:

select ... from features limit 1000 offset xxxx; 

функция запроса является:

with recursive recursion(child_id, parent_id, node_id, path) as (
    select h.child_id, h.parent_id, h.parent_id as node_id, ARRAY[h.parent_id] 
    from hierarchy h 
    where h.direct=true and h.child_id=$1 
union all 
    select h.child_id, h.parent_id, r.node_id, r.path || ARRAY[h.parent_id] 
    from recursion r join hierarchy h on h.child_id = r.parent_id 
    where h.direct=true and h.parent_id != r.node_id 
) 
select * from recursion 

Создание запроса, как это:

insert into hierarchy (parent_id, child_id, direct, path) values (%d, %d, false, %s::bigint[]) 
+0

* Когда postgres запускает рекурсивный запрос, он создает для него временную таблицу *. Нет, нет. Похоже, ваша структура создает временную таблицу и запускает рабочих. Запросы PostgreSQL 'WITH RECURSIVE' делают * не * создавать временные таблицы. –

+0

Временные данные отображаются в /var/lib/postgres/.../base/pgsq_tmp - что еще это может быть? – qMax

+0

Речь идет не о «рекурсивной», а о том, как не использовать память для расчетов. Я не вижу 'ORDER BY', поэтому, вероятно, CTE также создает временные файлы? @CraigRinger? –

ответ

0

Проблема заключалась в бесконечной рекурсии благодаря поддельным данные (циклические ссылки). В моем случае - рекурсивный запрос должен быть исправлен, чтобы справиться с ним.

+0

Любой, кто сталкивается с этим, запускает postgres с 'log_temp_files = 0', чтобы узнать больше о создании файла temp. –