Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1268 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  stocker array en RAM

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

stocker array en RAM

n°2187947
grosbin
OR die;
Posté le 29-04-2013 à 10:37:32  profilanswer
 

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
mood
Publicité
Posté le 29-04-2013 à 10:37:32  profilanswer
 

n°2187966
x1fr
Posté le 29-04-2013 à 11:54:32  profilanswer
 

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
n°2187977
GordonF_69
Posté le 29-04-2013 à 13:12:31  profilanswer
 

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
n°2187988
grosbin
OR die;
Posté le 29-04-2013 à 13:40:32  profilanswer
 

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
n°2188011
grosbin
OR die;
Posté le 29-04-2013 à 14:59:30  profilanswer
 

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
n°2188015
Riokmij
Blink and you're dead
Posté le 29-04-2013 à 15:10:47  profilanswer
 

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?!
n°2188033
grosbin
OR die;
Posté le 29-04-2013 à 16:04:28  profilanswer
 

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
n°2188136
flo850
moi je
Posté le 30-04-2013 à 08:28:26  profilanswer
 

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


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

n°2188140
Volkhen
Posté le 30-04-2013 à 09:44:03  profilanswer
 

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
n°2188346
rufo
Pas me confondre avec Lycos!
Posté le 01-05-2013 à 13:52:14  profilanswer
 

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
mood
Publicité
Posté le 01-05-2013 à 13:52:14  profilanswer
 

n°2188409
CyberDenix
Posté le 01-05-2013 à 23:04:21  profilanswer
 

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)
n°2188523
rufo
Pas me confondre avec Lycos!
Posté le 02-05-2013 à 12:23:06  profilanswer
 

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
n°2188531
flo850
moi je
Posté le 02-05-2013 à 13:22:02  profilanswer
 

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

 

Quel que soit le moteur.


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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  stocker array en RAM

 

Sujets relatifs
Accéder à une valeur particulière au sein d'un arbre (array)[php] xml vers array
Générer toutes les combinaisons d'un array muti dimensionnelstocker des instances
[VB.NET] Stocker des données non visibles par l'utilisateurODBC FETCH ARRAY
Class => comment manipuler un array ?Tableau python vers array php ?
$_GET, foreach et arrayPHP et Array
Plus de sujets relatifs à : stocker array en RAM


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR