Bonjour,
J'ai à ma disposition plusieurs grosses tables d'une BDD représentées très simplement de la forme suivante (j'ai inventé les noms mais la forme est là):
TABLE DEPART
Année | code | x | a1 | a2 | a3 | a4 | a5 | ... | a200
2015 1 x1 58 74 5 23 22 232
2015 1 x5 41 4 58 78 81 21
..................................................
Ces tables contiennent environ 200 colonnes de données (a1 - a200) et il y a environ 30 000 lignes
Le script consiste à déplacer toutes ces données dans diverses tables :
une pour la donnée :
TABLE DATA
id_data | code_data | info_data
...
7330 a1 donnée concernant x
7331 a2 donnée concernant y
...
7530 a200 donnée concernant z
De même il y en a une pour le "x"
Et les valeurs sont encore dans une autre table :
TABLE STOCKAGE
id_data(foreign key) | id_x(foreign key) | année | valeur
7330 541 2015 58
7331 632 2015 74
............
------------------
Fin de présentation
------------------
Donc le script est réalisé, mais je dois souvent faire des requêtes à la BDD (select pour savoir si la la donnée data/x/y existe déjà et si oui récupérer l'id sinon insérer data/x/y ).
Bref, dans l'algo, je cherche à récupérer toutes les colonnes (200 colonnes donc 200 requêtes d'insertion dans data), puis je récupère toutes les données pour les 30 000 lignes.
Ensuite pour chaque ligne je dois vérifier si le x n'existe pas déjà dans sa table (si oui je récupère son id sinon j’insère un nouveau). Avec 30 000 lignes ça veut dire que 30 000 select sont fait sur la table data. A la fin avec les id récupérés et les années je peux insérer dans la table de stockage ce qui donne encore 30000lignes*200colonnes de requêtes d'insertion.
Est-ce normal d'avoir autant de requête ou c'est mon code/algo qui est vraiment nul ?
Par ailleurs j'ai fait des tests sur un fichier 200colonnes*1500 lignes le script fonctionne mais pour un fichier 200colonnes*30000lignes il y a une erreur "Fatal error: Allowed memory size of xxxxx bytes exhausted ".
Cela fonctionne en augmentant la max_memory_limit à 1024M mais cela pose probablement des risques pour le serveur ?
Comment gérer ça sinon ? Sachant que l'erreur arrive lorsque j'essaye de récupérer les 30000*200 données dans un tableau, j'ai essayé de découper en récupérant les 5000 premières lignes et ainsi de suite mais le script génère toujours cette erreur, que ce soit 5000, 2000 ou 500.
Merci d'avance pour votre aide !
Message édité le 03 août 2015 à 15:55:41 par inight