J'ai une page d'administration de Django pour une liste de catégories imbriquées comme ceci: Prévenir les fuites de mémoire dans ce code javascript?
J'ai écrit ce script pour trier la liste et présenter hiérarchiquement:
{% extends "admin/change_list.html" %}
{% load i18n %}
{% block footer %}
<script>
(function(){
var rows=document.getElementById('result_list').getElementsByTagName('tr'),
table=rows[1].parentNode||rows[1].parentElement,
i=0, r, // skip the first row
data={}; // store category data
while (r=rows[++i]) {
var catName=r.getElementsByTagName('a')[0],
k=catName.innerHTML,
opts=r.getElementsByTagName('select')[0],
j=-1, opt;
while (opt=opts[++j]) {
if (!opt.selected) continue;
data[k] = {
title: k,
children: {},
parentName: opt.innerHTML,
parentId: opt.value,
catName: catName,
row: r
}
}
}
for (var sub in data) {
if (data[sub].parentName == sub) continue;
for (var sup in data) {
if (sup == data[sub].parentName) {
data[sup].children[sub]=data[sub];
data[sub].parent = data[sup];
break;
}
}
}
var alt = 0;
for (var leaf in data) {
if (data[leaf].parentName != leaf) continue;
walk(data[leaf], leaf, function (node, nodeName) {
var n=node, t=n.title;
while (n=n.parent) {
t = ' · ' + t;
}
node.catName.innerHTML = t;
node.row['class']=node.row['className']='row'+alt++%2;
table.removeChild(node.row);
table.appendChild(node.row);
});
}
function walk (leaf, leafName, cb) {
if (cb) cb(leaf, leafName);
leaf.ready = true;
for (var kid in leaf.children) {
if (leaf.children[kid].ready) continue;
walk(leaf.children[kid], kid, cb);
}
}
}());
</script>
{% endblock %}
... le script fonctionne très bien et la liste ressemble à ceci:
Ma question est: Je me sens comme le script est sujette à des fuites de mémoire dans les UAs avec faible garbage collection en raison des références circulaires créées par le parent/enfant st uff. Est-ce quelque chose dont je devrais m'inquiéter? Y a-t-il une meilleure façon d'écrire le script? Dois-je supprimer un tas de choses à la fin du script, et si oui, quoi?
Vous "avez l'impression" que le script est sujet à des fuites de mémoire, ou vous avez * observé * des fuites de mémoire? –
Je n'ai pas observé tout, mais je me sens comme IE pourrait faire quelque chose de stupide comme pas garbage recueillir quelque chose lorsque la page navigue. Malheureusement, je n'ai aucun moyen de tester cet ATM. –
est-ce que vous OS vous permet d'observer l'utilisation de RAM au fil du temps? Si oui, je suis sûr que vous pourriez mettre en place un test primitif pour voir si des quantités non désirées de mémoire sont fuites ... – Stefan