Salut,
A mon humble avis, je ne pense pas que ce soit possible. Car l'erreur que tu précise est "out of memory". Ce qui signifie que tes données ne peuvent pas toutes être contenues en mémoire en même temps.
Pour moi la seule chose à faire est de récupérer les données en des blocs et de les traiter les uns après les autres suivant cet algorithme que je te propose :
1) tu écris une requête qui fait count(*) et qui récupére la quantité des données recherchées.
select count(*) from tables where ...
(on va supposer que tu mettes le résultat de cette requête dans une variable entière qte)
2) tu choisis un entier n raisonnable, qui représente le nombre de blocs de données à récupérer les uns après les autres. (si tu obtiens encore ton erreur, t'auras qu'à augmenter la taille de n)
3) tu écris n requêtes SQL de la forme suivante (une boucle à n tours):
select ... from tables where ... limit partieEntiereInf(qte/n)
(récupération des partieEntiereInf(qte/n) premier resultats.
NB : partieEntiereInf(qte/n) est calculé dans le programme avant d'être utilisé dans la requête)
select ... from tables where ... limit partieEntiereInf(qte/n)+1, 2*partieEntiereInf(qte/n)
(récupération des données compris entre [partieEntiereInf(qte/n)+1, 2*partieEntiereInf(qte/n)]
select ... from tables where ... limit 2*partieEntiereInf(qte/n)+1, 3*partieEntiereInf(qte/n)
...
Il s'agit d'un algorithme, à toi de bien l'adapter.
Tu vois, je pense vraiment que t'es obligé de faire la boucle comme tu le suggérais pour résoudre le problème de mémoire RAM que tu rencontres, sinon, je ne connais aucune instruction SQL qui permet de résoudre un problème de mémoire pleine.
Cordialement.
Partager