Necesito agregar una nueva columna a una tabla django grande (5 m de fila). Tengo un sur schemamigration
que crea la nueva columna. Ahora estoy escribiendo un script datamigration
para rellenar la nueva columna. Se parece a esto. (Si no está familiarizado con las migraciones al sur, simplemente ignorar la orm.
anteponiendo el nombre del modelo.)Migración de datos eficiente en una gran tabla django
print "Migrating %s articles." % orm.Article.objects.count()
cnt = 0
for article in orm.Article.objects.iterator():
if cnt % 500 == 0:
print " %s done so far" % cnt
# article.newfield = calculate_newfield(article)
article.save()
cnt += 1
Cambié de objects.all
a objects.iterator
para reducir los requisitos de memoria. Pero algo todavía está consumiendo mucha memoria cuando ejecuto este script. Incluso con la línea realmente útil comentada como arriba, la secuencia de comandos todavía crece a usar 10+ GB de ram antes de llegar muy lejos de la mesa y renunciar a ella.
Parece que algo se aferra a estos objetos en la memoria. ¿Cómo puedo ejecutar esto para que no sea un cerdo de memoria?
FWIW, estoy usando python 2.6, django 1.2.1, south 0.7.2, mysql 5.1.
Lo resuelve por mí. Creo que DEBUG guarda en caché toda la consulta, por lo que si está insertando 10 GB como parte de su migración de datos, usa (más de) 10 GB de memoria. O en mi caso falla, ya que estoy usando un kernel PAE de 32 bits. –
¿este ajuste todavía es necesario en las versiones más nuevas de Django? – nivniv
Es necesario hasta Django 1.7, pero aún se recomienda: se ha establecido un límite estricto de 9000 consultas almacenadas en memoria en Django 1.7 o 1.8. –