Array et mémoire

Résolu
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010 - 10 avril 2009 à 10:46
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010 - 11 avril 2009 à 18:24
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

Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
11 avril 2009 à 18:24
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 !
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
10 avril 2009 à 11:15
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
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
10 avril 2009 à 11:17
et... t'es sûr qu'initialiser ce tableau est nécessaire ?
0
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 11:31
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 11:38
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...
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
10 avril 2009 à 11:42
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.
0
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 11:51
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
0
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 15:07
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
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
10 avril 2009 à 15:09
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)
0
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 15:19
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...
0
Larwin Messages postés 44 Date d'inscription dimanche 25 novembre 2001 Statut Membre Dernière intervention 24 juillet 2010
10 avril 2009 à 15:44
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
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
10 avril 2009 à 15:53
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)
0
Rejoignez-nous