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()

1 комментарий: