Array et mémoire

[Résolu]
Signaler
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010
-
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010
-
Bonjour à toutes et à tous.
J'ai un gros problème de mémoire sur IE avec des tableaux. Je m'explique dans ces quelques lignes qui font exploser la mémoire du navigateur alors que cela n'est pas si violent avec firefox, chrome , opéra ou que sais je...

// --------------------

var x;
items = new Array();

for (x=0; x<10000; x++){
items.push({data : {name : {value : '', extvalue : ''}, surname : {value : '', extvalue : ''}, age : {value : '', extvalue : ''}, cp : {value : '', extvalue : ''}, ville : {value : '', extvalue : ''}, pays : {value : '', extvalue : ''}}});
}


... je peux faire le même test avec un truc du genre


for (x=0; x<10000; x++){
items.push(new Array);
items[x]['name'] = {value : '', extValue : ''};
items[x]['surname'] = {value : '', extValue : ''};
items[x]['age'] = {value : '', extValue : ''};

... etc...

}

le résultat est toujours le même et sans appel :
explosion de la mémoire d'IE dans le gestionnaires des taches. genre +60Mo pour l'exemple quand sur chrome seulement +2 à +3Mo et ff pareil.

j'ai besoin de gros tableaux a plusieurs dimensions et d'utiliser des tableaux associatifs...

Merci de votre aide

12 réponses

Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

bon je n'ai toujours pas trouvé de solution convenable pour ne pas faire exploser la mémoire du processus du navigateur en déclarant directement mes tableau en javascript, je n'y suis donc pris d'une autre façon.

Je fais donc une requete xmlhttprequest et j'exploite le résultat comme si c'était mon tableau que je complete plus tard a ma sauce.
Ca ne semble pas avoir d'impact important sur la mémoire.

Merci a tous quand même !
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
Bonjour,

bah...
avec    
    var x;
    items = new Array();
    for (x=0; x< 100000 ; x++)
    {    window.status =x;
        items.push     (     {    data : { name : {value : '', extvalue : ''},
                                                 surname : {value : '', extvalue : ''},
                                                 age : {value : '', extvalue : ''},
                                                 cp : {value : '', extvalue : ''},
                                                 ville : {value : '', extvalue : ''},
                                                 pays : {value : '', extvalue : ''}   
                                               }
                                 }
                           );
    }
   
aucune explosion ( IE  ou les autres )

t'es sûr de ne faire que cela dans ta boucle ?
( si tu touchais à body.innerHTML par exemple on comprendrait )

et si c'est du à ce genre de choses, que tu ne peux pas éviter :
fait une boucle avec setTimeout.

Cordialement [mon Site] [M'écrire] Bul
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
et... t'es sûr qu'initialiser ce tableau est nécessaire ?
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

en fait oui je ne fait que ca...
me suis même fait un autre fichier .html avec tout le code a l'interieur.
et ca explose clairement
je suis sous vista intégrale ie7
et toi Bul3 ?
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

le code :

items = new Array();
alert('starting');

var z = new Date().valueOf();


var x;
items = new Array();
for (x=0; x<100000; x++)
{ window.status=x;
items.push ( { data : { name : {value : '', extvalue : ''},
surname : {value : '', extvalue : ''},
age : {value : '', extvalue : ''},
cp : {value : '', extvalue : ''},
ville : {value : '', extvalue : ''},
pays : {value : '', extvalue : ''}
}
}
);
}


var y = new Date().valueOf();
alert(y-z + 'ms');



ma mémoire d'IE explose avec ces 100000 à 581Mo pour le processus...
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
IE8+windows XP (sp2) mais bon, à ce niveau ie7+vista ce doit être pareil
testé avec safari, chrome, FF[3], opera, k-meleon...
pas de souci non plus
je disais aussi : t'es sûr qu'initialiser ce tableau est réellement nécessaire ??
à priori, je ne vois pas pourquoi.
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

oui en fait je refais la listview windows en javascript.
donc j'ai besoin de stocker des données qui seront envoyé par un serveur
evidemment y'aura pas 100000 rows mais j'aime les tests un peu excessifs.
je conserverais donc le donnée dans un tableau et les afficherai a la demande dans la listview qui aura un nombre de d'objet dom limité.
je joue sur la mise a jour des données dans le controle a la volé en utilisant ce tableau.
je vais essayer sur un autre poste, et puis tenter avec ie8.
merci de ta réponse bul3
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

le problème reste le même sur ie8, l'utilisation de la mémoire est excessive.
Près de 500 Mo pour l'exemple... :(
j'ai aussi testé sur un autre poste avec la même config ie7 et vista, même problème. Je vais faire un nouveau test avec XP...
En attendant si quelqu'un a une autre idée, il est le bienvenu !

Merci
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
18
Bonjour,
ATTENTION mettre window.status =
x; est très gourmant en temps

Concernant la créatin, je te
propose une autre approche pour ne pas avoir à créer à chaque itération un
objet, on en crée un global
exemple
//-------------

function Data(){
  this.value = '';
  this.extvalue = '';

}
//--------------
function
Enreg(){
  this.data = new Object;
  this.data.name = new Data();

  this.data.surname = new Data();
  this.data.age = new Data();

  this.data.cp = new Data();
  this.data.ville = new Data();

  this.data.pays = new Data();
}
entre nous le data est peut être de trop, mais bon...

ta boucle
devient
//-- Lancement creation
var x;
var z = new
Date().valueOf();
var items = new Array(); // le
tableau
var Objet = new Enreg(); //
Creation de l'objet
for (x = 0; x < 100000; x++) {

  items.push( Objet);
}
//-- Fin creation

var y = new Date().valueOf();
alert(y - z + 'ms');
Je terminerai en disant qu'en faisant items[x] = Objet; à la place de items.push( Objet); tu grattes encore un peu...

A toi de voir le gain...
;O)
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

je concède que le data est de trop dans l'exemple :)
mais je fais ce test car dans ton exemple la "class" Enreg aura certainement d'autre données du type this.isVisible, this.isOver ...etc. et il se peut qu'il arrive qu'il y ai un this.name a ne pas confondre avec un this.data.name, dans l'exemple.

Je test le code, merci PetoleTeam, mais il me semble que je suis aussi deja allé dans cette direction aussi de mon coté sans succès...
Messages postés
44
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
24 juillet 2010

bon oui j'avais pas fait trop attention...
c'est pas vraiment ce qu'il me faut ca :) en fait le tableau items sert pas a grand choses ici :) en fait tous les 'Object' seront les mêmes dans le tableau items.

ce qu'il faudrait c'est

var items = new Array(); // le tableau
for (x = 0; x < 100000; x++) {
items.push(new Objet);
}

mais faire cela ne change pas la quantité de donnée en mémoire. 500 Mo de plus :(

raté; j'ai l'impression que ie charge une quantité de donnée importante a la création de class ou de tableau qui s'imbrique les unes dans les autres...

Je vois pas trop quoi faire
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
18
1001 excuses j'ai pensé qu'il s'agissait d'un problème
de temps d'exécution et non d'un problème de mémoire...
;O)