2011-11-09 13 views
5

He creado un JSFiddle para ver la cantidad de datos que puedo insertar en mi navegador.¿cuántos datos pueden contener javascript en el navegador?

El enlace es http://jsfiddle.net/GWxAk/

El código es simple. Solo trata de insertar tantas cadenas como sea posible en una matriz. Las cadenas tienen una longitud aproximada de 300-310 caracteres.

Mi pregunta es: ¿El resultado depende de la cantidad de memoria que tengo en mi PC? ¿difiere realmente el navegador del navegador?

Por ejemplo, si tengo 8 gb de ram obtendré mucho más que si tengo 4 gb?

var s = ''; 
for (var i = 0; i < 300; i++) { 
    s += 'a'; 
} 

array = []; 
count = 0; 

function doMore() { 
    for (var i = 0; i < 1000; i++) { 
     count++; 
     array.push(s + count); 
    } 
}; 

function repeat() { 
    doMore(); 
    document.body.innerHTML = 'size:' + array.length; 
    setTimeout(repeat, 100); 
} 

repeat(); 

En mi caso cromo cuelga al 14850000 y tengo 4 GB de RAM Eso es una matriz de casi 15 millones de artículos. No está mal, creo que

¿Ustedes obtienen lo mismo? Alguien me puede decir cómo dar tanta memoria como sea posible para el navegador

Gracias

+3

¿Tiene una situación de vida real para esto, o simplemente está aburrido en el trabajo? – Matt

+0

Tengo 16 GB de RAM en mi máquina y llegué a un punto un poco más del doble donde lo hizo. Puede ver mis resultados en la captura de pantalla aquí http://screencast.com/t/3Xl31yGgHWC –

+0

Parece una especie de característica de seguridad del navegador. El mío se detiene en el mismo número aunque no haya habido ninguna tensión en la máquina. Con Chrome y 16GB de RAM. – Toast

Respuesta

7

Una vez más, mi máquina con 16 GB de RAM. Puedo ver el aumento del uso de la RAM del navegador a medida que aumenta, así que supongo que también está limitado por la memoria RAM.

IE crapped out at 16,840,000 
Chrome at 14,850,000 
Firefox 32,890,000 
Safari recycles itself around 8,720,000 (LOL @ Apple) 

Aquí está una captura de pantalla de uso de la memoria y Firefox http://screencast.com/t/3Xl31yGgHWC

+0

Muchas gracias. tu respuesta es muy útil. – Zo72

2

estoy en el cromo y yo trataba de su prueba y se bloquea en el mismo 14850000 usted ha mencionado, incluso si sólo tengo 2 GB de RAM y estoy ejecutando una máquina virtual con ventanas dentro de mi instalación de Linux que di 700Mb de RAM así que supongo que sí Chrome tiene un límite

+0

Hasta [muy recientemente] (http://code.google.com/p/v8/issues/detail? id = 847), V8 (motor JS de Chrome) tenía un límite superior duro de 1 GB. Eso está solucionado, pero el límite predeterminado es 700/1400 MB en compilaciones de 32/64 bits. – josh3736

0

En una máquina de 32 bits, su límite superior siempre será 4GB, no si ands o peros. En la práctica, será muy diferente de máquina a máquina (no es raro tener más de 10 pestañas abiertas)

Mejor manera de hacerlo: conserve solo los datos en los que su usuario está trabajando activamente o cualquier cosa que no pueda recuperar rápidamente del servidor a mano. Todo lo demás, obtenga cuando el usuario lo solicite.

+0

En realidad, solo podrá utilizar entre 2 y 3 GB del espacio de direcciones de 32 bits. Esto también se aplica a los procesos de 32 bits (que puede ser el motivo por el que incluso en las máquinas de 16 GB se detiene tan temprano). Nota: la matriz en este ejemplo no solo requiere una gran cantidad de memoria, sino que requiere una gran cantidad de memoria contigua. –

2

Asumamos UTF8, es decir, su 'a' es 2 bytes/8 bits.

  • 14.850.000 * 300 = 4455000000 personajes

  • 14850000 * 300 * 2 = 8,910,000,000 bytes

  • 8910000000/1024 = 8,701,171.875 KB
  • (8910000000/1024)/1024 = 8,497.238159179688 MB
  • ((8910000000/1024)/1024)/1024 = 8.298084139823914 GB

Como tal, podemos suponer de su prueba que la longitud máxima de una cadena en el motor Chromes JS es de 4,455,000,000 de caracteres, o ~ 8,3 GB en la memoria.

Pero, por supuesto, esto no es lo que está sucediendo.Solo tienes 4GB de RAM, pero ~ 4298MB han aparecido de la nada de acuerdo a las cifras, y están las estructuras de la variable de la matriz en sí misma y la máquina virtual Java y Chrome en sí no cuentan para etc.

Sin mencionar que eres re presionando s + count no s por sí mismo, por lo que la longitud de la cadena que se agrega aumenta a medida que aumenta el número de dígitos en el conteo. Si s era lo mismo, entonces es probable que el valor se internara para salvar la memoria del motor V8. Como referencia, la cantidad de caracteres adicionales añadidos debido a la variable de recuento, y debido a su aumento no lineal en la longitud, es de 9,7438,889 caracteres o 185,85 MB de datos.

Entonces algo más debe estar pasando aquí.

En cuanto a los límites del motor V8 JS:

http://code.google.com/p/v8/issues/detail?id=847

El espacio de direcciones de memoria de 32 bits es el límite superior, y de 64 bits, que enlazan sugieren ~ 1.9GB aunque es muy probable que sea el límite superior de lo que su sistema operativo puede admitir y está físicamente disponible.

Entonces, para resumir:

  • de 32 bits será siempre un límite superior, no de la variable específica js, sino de todo el paquete de contenidos VM, render, página JS, etc
  • Su prueba es no del todo fiable ya que los artículos que está contando no son idénticos
  • si fueran idénticos, que le cae falta de manejo de caso especial de cuerdas

de edición:

+0

Agrego conteo a s para asegurarme de que cada cadena sea diferente. Mi prueba es confiable porque cada elemento debe ser único. – Zo72

+0

no del todo, el primer elemento será 1 carácter más corto que el 11, que será un carácter más corto que el 101, que será un carácter más corto que el 1001, etc., por lo que el número al final no es contar unidades de igual tamaño (independientemente del contenido), como la cadena final añadida a la matriz, es mucho más grande que la cadena inicial. –

+0

p. Ej.mi camioneta contiene 50 doghnuts y la tuya contiene 20 nueces, es una comparación sin sentido si las nueces no son del mismo tamaño –

Cuestiones relacionadas