2010-01-08 24 views
7

Hagámoslo claro inmediatamente: ¡esta no es una pregunta acerca de la pérdida de memoria! Tengo una página que permite al usuario ingresar algunos datos y un JavaScript para manejar estos datos y producir un resultado. La JavaScript produce salidas incrementales en un DIV, algo como esto:javascript para encontrar memoria disponible

(function() 
{ 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    if (done) { 
     return; 
    } else { 
     setTimeout(arguments.callee, 0); 
    } 
})(); 

Bajo ciertas circunstancias, el cálculo producirá tantos datos que IE8 fallará con este mensaje:

no es suficiente almacenamiento cuando tratar con demasiados datos

La pregunta es: ¿Hay alguna manera de averiguar cuántos datos son demasiados datos?

como he dicho, no hay errores que resolver. Es una pérdida de memoria genuina porque el cálculo requiere crear demasiados elementos html.

Mi idea sería ejecutar una función antes de ejecutar el cálculo para calcular si el navegador tendrá éxito. Pero para hacerlo, de una manera genérica, creo que necesito encontrar la memoria disponible para mi navegador.

Cualquier sugerencia es bienvenida.

+0

con tantos datos, no puede hacer frente incluso el usuario? – jldupont

+0

¿Funciona para rodear el código con try/catch? – erikkallen

+0

'memory.performance.usedJSHeapSize' funciona bien ahora en Chrome. –

Respuesta

5

Javascript (en el navegador) se ejecuta en un entorno limitado, lo que significa que es cercada de acceso cosas que podrían causar problemas de seguridad tales como archivos locales, los recursos del sistema, etc - lo que no, se puede' t detectar el uso de memoria.

Como las otras respuestas indican, puede hacer que la tarea sea más fácil para el navegador pausando entre implementaciones o utilizando un código con menos recursos, pero cada navegador tiene sus límites.

+0

gracias por su respuesta. Sospeché que no podía detectar el uso de la memoria. – Zo72

0

Sospecho que el problema es tener un retraso de tiempo de espera de 0 - se trata de volver a ejecutar al instante. Intenta aumentar esto.

+0

no, no lo es. el retraso de 0 timeout es una técnica bien conocida. google alrededor si no me crees – Zo72

1

Un bucle utilizará menos memoria que la recursión.

do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done); 

También podría poner un límite superior en el número de respuestas producidas.

var answerCount = 0; 
    do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done && answerCount++ < 1000); 
+0

Has malentendido completamente la pregunta. no hay recursión !!! ------------------------- – Zo72

+0

Pasando argumentos.invoca a setTimeout invoca la función nuevamente, pero está en lo correcto, no es estrictamente recursividad porque el setTimeout permite que la función de llamada regrese (al menos debería, pero quizás el delay = 0 está optimizado para llamar inmediatamente, en cuyo caso lo haría ser recursividad). Usar un bucle con un contador seguirá siendo útil y el código será más fácil de leer. –

+0

incluso con retraso = 0 no tiene recursión. – Zo72

3

tener un juego con esto ...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>'); 
document.write(performance.memory.usedJSHeapSize+'<br><br>'); 
document.write(performance.memory.totalJSHeapSize); 
+0

el objeto de rendimiento ... es bueno saber gracias – Zo72

Cuestiones relacionadas