stocker array en RAM - PHP - Programmation
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
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
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
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 ..
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.
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
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
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 ) |
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
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...
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.
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...
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.
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
---------------
Photos Panoramiques Montagnes Haute Savoie