优化在django中获取大量对象的时间和内存?

时间:2016-09-01 15:31:05

标签: postgresql django-models query-optimization django-orm psycopg2

有多个表包含超过100万条记录,我必须执行以下操作:

for record in GiantTable.objects.all():
    doSomethingAwesome(record)

我试过了:

  1. Django paginator,但它再次对DB进行多次调用。
  2. 迭代器,但它并没有真正帮助优化时间和内存。
  3. 还使用了建议here的偏移和限制,但它再次进行了多次数据库调用。
  4. 最后我最终编写了一个函数并在postgreSQL中创建了游标:

    CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS $$
    BEGIN
        OPEN $1 FOR SELECT * FROM giantTable;
        RETURN $1;
    END;
    $$ LANGUAGE plpgsql;
    

    psycopg2中所述,并将此光标称为:

    import psycopg2
    
    conn = psycopg2.connect("dbname=test user=root")
    cur1 = conn.cursor() cur1.callproc('reffunc', ['curname']) 
    cur2= conn.cursor('curname') 
    for rec in cur2.fetchall():
        doSomethingAwesome(rec)
    

    我有两个疑问:

    1. 正如psycopg2中所述,

        

      默认值2000允许每次往返获取大约100KB,假设记录了10-20列混合数字和字符串

      但是这是否意味着postgreSQL每次在2000条记录之后都会命中DB,它如何返回结果?因为当我len(cur2.fetchall())时,需要花费时间并返回总记录数。我应该在postgreSQL FETCH 2000 FROM gigantic_cursor;中编写另一个函数,并在每2000个记录后从django调用此函数吗?

    2. 我应该采用这种方法,并对所有其他表做同样的事情。这是减少记忆和时间的最佳方式,还是我误解了什么?

0 个答案:

没有答案