2013-02-10 2 views
3

Я написал скрипт, который выполняет итерацию через большую таблицу базы данных. (~ 150K строк.) Чтобы избежать использования слишком большого объема памяти, я использую этот windowed_query method. Мой сценарий идет что-то вроде этого:Ошибка памяти Python SQLAlchemy в Linux

query = db.query(Table) 

count = 0 
for row in windowed_query(query, Table.id, 1000): 

    points = 0 

    # +100 points for a logo 
    if row.logo_id: 
     points += 100 

    # +10 points for each image 
    points += 10 * len(row.images) #images is a SQLAlchemy one-to-many relationship 

    #...The script continues with much of the same... 

    row.points = points 
    db.add(row) 

    count += 1 
    if count % 100 == 0: 
     db.commit() 
     print count 

request.db.commit() 

При попытке запустить его на сервере CentOS, он делает это через 9000 строк перед убитым ядром , потому что он использует ~ 2 Гб памяти.

В моей среде разработки Mac он работает как шарм, хотя он работает на той же версии Python (2.7.3), SQLAlchemy (0.7.8) и psycopg2 (2.4.5).

Использование памяти_profiler для некоторой простой отладки: в Linux каждый фрагмент кода, который запрашивает базу данных, увеличил объем памяти небольшим количеством, причем рост никогда не останавливался. На Mac произошло то же самое, но после роста ~ 4 МБ он выровнялся. Как будто в Linux ничего не собирается собирать мусор. (Я даже пытался запустить gc.collect() каждые 100 строк. Ничего не делал.)

Кто-нибудь знает, что происходит?

+0

Возможно, вы страдаете от этой ошибки? http://www.velocityreviews.com/forums/t649192-psycopg2-and-large-queries.html –

+0

Но с 'windowed_query' самый большой запрос - 1000 строк, поэтому' fetchone', используя память 'fetchall', не делает объясните использование 2 ГБ памяти. –

+3

Aaahhhh .... Я понял. Я использую Pyramid и включаю панель инструментов отладки. После его отключения использование памяти платилось на уровне 73 МБ. Задача решена! –

ответ

4

Оказалось, что debugtoolbar Pyramid включен, что стало причиной использования высокой памяти. Я отключил его, и скрипт работал как шарм.

+0

Yup, большинство панелей инструментов для отладки содержат sql, который отправляется на сервер для последующей отладки (также было похожее удовольствие с панелью инструментов отладки Flask). – plaes