Requête sur base access à un million de lignes

Résolu
roro59650 Messages postés 99 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 28 juillet 2011 - 24 juin 2011 à 10:42
roro59650 Messages postés 99 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 28 juillet 2011 - 24 juin 2011 à 14:48
Bonjour à toutes et tous!

Voilà, je suis dans une petite panade...
Pour une appli, il faut que je lise une table sur une base Access, qui contient 1 150 000 lignes. Et ensuite, il faut que l'introduise sur une base MySql.
J'utilise PDO pour lire les base Access et MySql.
Mais je ne trouve pas comment faire pour qu'un variable puisse enregistrer un million de lignes... Car j'ai toujours un problème de "Fatal error: Out of memory (allocated 1702100992) (tried to allocate 44 bytes) in db.php on line 35".
function select($req, $values = NULL) {

if(!is_numeric($values) && $values == NULL) {
$values = array();
} elseif(!is_array($values)) {
$values = array($values);
}

$this->sth = $this->dbh->prepare($req);
$this->sth->execute(array_values($values));
$h_data = $this->sth->fetchAll(PDO::FETCH_ASSOC);

return $h_data;
}


J'ai donc une erreur sur la ligne "$h_data = $this->sth->fetchAll(PDO::FETCH_ASSOC);". J'ai beau augmenter la memory_limit à des valeurs folles (5 000 000M), ça ne change rien.
Si je fais un memory_get_peak_usage, il me met 1.58 GB quelle que soit la limite que je met...

Si vous avez une idée, s'il vous plait.

Merci!!

Romain

4 réponses

roro59650 Messages postés 99 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 28 juillet 2011 1
24 juin 2011 à 14:48
Merci pour vos réponses rapides!

Mais vu qu'il n'y a pas d'équivalence de Rownum, ou limit, je fait faire un TOP de la moitié des champs triés selon l'identifiant par ordre croissant ou décroissant.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 juin 2011 à 13:14
Est ce que tu peux séléctionner une parties des lignes avec un
SELECT * FROM TABLE WHERE ROWNUM<1000;


Si oui, tu peux faire la migration toutes les 10000 lignes à l'aide d'un programme.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 juin 2011 à 13:15
augmenter la augmenter la memory_limit ne change rien, c'est les limites de la mémoire physique qui sont atteintes, a part ajouter de la ram, il n'y a rien à faire
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
24 juin 2011 à 14:23
Alors ça remonte à trèèèèès longtemps..
J'avais utilisé la fonction TOP dans le SELECT (ROWNUM c'est Oracle non ??) et effacer N enregistrements et le tout en boucle..
Autre méthode, tu cherches dans une colonne toutes les valeurs distinctes et tu fais un select sur un filtre sur cette colonne et tu boucles..
S.
0
Rejoignez-nous