Я написал скрипт, который выполняет итерацию через большую таблицу базы данных. (~ 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 строк. Ничего не делал.)
Кто-нибудь знает, что происходит?
Возможно, вы страдаете от этой ошибки? http://www.velocityreviews.com/forums/t649192-psycopg2-and-large-queries.html –
Но с 'windowed_query' самый большой запрос - 1000 строк, поэтому' fetchone', используя память 'fetchall', не делает объясните использование 2 ГБ памяти. –
Aaahhhh .... Я понял. Я использую Pyramid и включаю панель инструментов отладки. После его отключения использование памяти платилось на уровне 73 МБ. Задача решена! –