stocker array en RAM

stocker array en RAM - PHP - Programmation

Marsh Posté le 29-04-2013 à 10:37:32    

Bonjour,
dans le cadre d'un programme, j'écris bcp de fichiers, des Arrays sérialisés sur un RAMdisk pour que cela soit plus rapide
Je me demande s'il est possible, à la place, de mémoriser le Array directement dans la RAM ( c'est à dire ne plus avoir à serialiser, unserialise qui prend 5 sec maintenant que les données sont conséquentes ) à chaque fois qu'il y a une lecture / écriture
 
Pensez vous qu'une telle chose soit possible ? Qu'en est-il pour un localhost sous windows ? Merci pour vos lumières  :jap:


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 29-04-2013 à 10:37:32   

Reply

Marsh Posté le 29-04-2013 à 11:54:32    

Vu sur stackoverflow, l'utilisation de l'extension APC :
http://www.php.net/manual/fr/book.apc.php
 
le topic ici : http://stackoverflow.com/a/4089404


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 29-04-2013 à 13:12:31    

Ya un repertoire sous linux qui est directement en RAM, jme souviens plus lequel, donc ta qu'a écrire ton fichier dessus.
 
 
J'ai retrouvé : http://linux.leunen.com/?p=1246


Message édité par GordonF_69 le 29-04-2013 à 13:13:03
Reply

Marsh Posté le 29-04-2013 à 13:40:32    

Mon problème de base c'est le temps perdu à serialiser / déserialiser les données
donc je recherche plus du côté d'APC pour windows, j'essaye les extensions mais elles me font planter apache

 

edit : trouvé la bonne version : php_apc-3.1.5-5.3-vc6-x86.zip


Message édité par grosbin le 29-04-2013 à 14:29:10

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 29-04-2013 à 14:59:30    

C'est très ironique, cela prend plus de temps d'enregistrer sur APC que serialiser / déserialiser un Array sur un RAMFS ..


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 29-04-2013 à 15:10:47    

Et c'est pas envisageable de revoir le design de ton application pour remplacer tes tableaux par une base de données ? (pas forcément du sql, mais peut-être un truc genre Redis)  
 
Parce que si vraiment leur taille est telle que leur sérialisation/désérialisation prend trop de temps, c'est à mon avis un signe que ton architecture a atteint ses limites.


---------------
Are you two fucking? Are you serious? Right in front of my salad?!
Reply

Marsh Posté le 29-04-2013 à 16:04:28    

La table fait déjà 86000 enregistrements, j'ai placé les fichiers MYD sur le ramdisk ( via une jonction )
L'application sert à comparer les lignes et marquer celles en doublons ( vis à vis des numéros de téléphones répartis sur 5 champs ).

 

Trouver un numéro dans la table prend 4 secondes par opération .. super lent
J'ai détecté les doublons en premier lieu en faisant un preg_match_all sur chacun d'entre eux dans un fichier brut
Je me demande si en faisant un in_Array ( recursif ) cela passerait mieux ??

 

edit: oui, 150ms par numéro avec la méthode array keys -> je construis un index propre des doublons pour les marquer ensuite en sql

Message cité 1 fois
Message édité par grosbin le 29-04-2013 à 16:47:36

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 30-04-2013 à 08:28:26    

Tu mets une clé (éventuellement) unique sur tes 5 champs : ca ira plus vite et ce sera plus propre


---------------

Reply

Marsh Posté le 30-04-2013 à 09:44:03    

grosbin a écrit :

La table fait déjà 86000 enregistrements, j'ai placé les fichiers MYD sur le ramdisk ( via une jonction )
L'application sert à comparer les lignes et marquer celles en doublons ( vis à vis des numéros de téléphones répartis sur 5 champs ).
 
Trouver un numéro dans la table prend 4 secondes par opération .. super lent
J'ai détecté les doublons en premier lieu en faisant un preg_match_all sur chacun d'entre eux dans un fichier brut
Je me demande si en faisant un in_Array ( recursif ) cela passerait mieux ??
 
edit: oui, 150ms par numéro avec la méthode array keys -> je construis un index propre des doublons pour les marquer ensuite en sql


Les données sont déjà dans une DB ? Si oui, quelle en et la structure ?
Parce que faire péter du doublon, ça sent l'auto-jointure. Et 86k enregistrements  [:tim_coucou:1]


---------------
Main/Alt1/Alt2/Alt3
Reply

Marsh Posté le 01-05-2013 à 13:52:14    

Plutôt que de faire une table avec 5 champs, je te conseille de faire 2 tables en relation 1-n, la 2ème contenant les n° de tél + la clé étrangère pointant sur la première table. Si un enregistrement de la première table contient plusieurs n° de tel, elle aura plusieurs entrées dans la table n°2. Pour détecter les doublons, suffit alors de faire un group by sur le champ contenant les n° de tél et de faire un count() + un having avec une condition sur le count > 1 ;)
 
Ca devrait être beaucoup plus rapide. Si c'est pas suffisant, mets les 2 tables en moteur "Memory" plutôt que Myisam. Enfin, tu peux tuner le fichier de conf de mysql pour augmenter la taille de certains buffers ou de caches...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-05-2013 à 13:52:14   

Reply

Marsh Posté le 01-05-2013 à 23:04:21    

Question bête : t'as essayé d'écrire ton tableau non sérialisé dans un fichier stocké sur RAM FS ?
 
Pour l'écriture, ça te prendrait autant de temps que la sérialisation (car il faut parcourir le tableau pour l'écrire), par contre, à la lecture, il te suffira de faire un require montableau.php
 
Je dis ça, ça reste expérimental, faut voir les perfs.
 
Après faut voir les traitements que tu fais dessus, essaye de bien cibler QUI est le bottleneck : tes traitements ou le stockage en RAM, voir le stockage en base de données.
 
D'ailleurs, si ta BD est mal configurée, tu auras des perfs de chiotte. Vérifies que tu es InnoDB, que la taille de ton buffer peut contenir toutes tes données, que tu es en O_DIRECT, que le format des tables est barracuda, que tu as compressé tes tables, ...etc.


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 02-05-2013 à 12:23:06    

S'il fait beaucoup plus de lecture que d'écriture, le moteur MyIsam est plus performant qu'InnoDB il me semble...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-05-2013 à 13:22:02    

Nan mais une recherche simple dans  86k enregistrement c'est rien c'est quelques ms de requête

 

Quel que soit le moteur.


---------------

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed