2009-09-19 8 views
1

Comment ne pas avoir le jeu de résultats complet de mysql copié dans la mémoire en django? Je suis en train de parcourir une grande table qui fait exploser mon bélier lorsque la requête est copiée.Django: requête mysql sans tampon

Il semble que mysql utilise SSCursor à cet effet, et je peux faire tout cela avec l'interface de bas niveau mysql, mais y a-t-il une façon Django de le faire?

+0

Avez-vous besoin du résultat complet? Est-ce que minimiser les lignes retournées par la requête fonctionne? – northpole

+0

non, je dois faire une opération par rangée, mais je ne reviendrai jamais sur les rangées passées, donc les avoir en mémoire est une perte. –

Répondre

1

Cela obtenir 500 articles chaque itération:

count = Model.objects.count() 
chunk = 500 
for i in range((count/chunk)+1): 
    objs = list(Model.objects.all()[i*chunk:(i+1)*chunk]) 

Vous pouvez également jeter un oeil à la QuerySet method iterator().

+0

Est-ce aussi optimal qu'un curseur non tamponné sur l'ensemble de données? Si non, combien pire? –

+0

Afaik Qu'est-ce que cela fait effectivement est "SELECT stuff FROM table LIMIT <(i+1)*slice> OFFSET ." Vous étiez préoccupé par votre utilisation de la mémoire, cela va le résoudre, car il garde juste un nombre fixe de lignes en mémoire. L'inconvénient est qu'il existe plusieurs requêtes SQL, mais cela ne devrait pas être trop mauvais. – stefanw

+0

Le truc d'iterator() semble lire le résultat ligne par ligne, donc c'est peut-être ce que vous cherchez. – che