Apr 11, 2012

SQLAlchemy и большие таблицы (Memory error)

SQLAlchemy в больших таблицах при таком запросе s.query(TableName).all() зависает и выдает ошибку Memory error. Для решения проблемы нужно использовать метод yield_per(). Если необходимо еще изменять данные, то нужно делать коммиты каждые N записей.

Пример:

def fdbarp(self):
    ''' Функция переноса арпов из одной таблицы в другую.
        Около 3млн записей.
    '''
    for i, arp in enumerate(s.query(Arp).yield_per(100)):
        new_arp = newArp()
        new_arp.equipment_id = arp.equipment
        new_arp.mac = arp.mac
        new_arp.ip = arp.ip
        new_arp.first_seen = arp.first_seen
        new_arp.last_seen = arp.last_seen
        new_arp.times = arp.times

        s.add(new_arp)
        if not i%10000:
            s.commit()
            s.close()
        print "arp ", i

    s.commit()

Comments

comments powered by Disqus