Mi PC tiene 2 GB de memoria RAM. Cuando formulo un objeto de malla 3D con una matriz de 70,000 elementos en C# 2008 Express Edition, recibo el mensaje de error "Excepción de desbordamiento de pila manejada ...". Si actualizo la memoria RAM de 2 GB a 4 GB, ¿puedo superar este mensaje de error?¿Puede la actualización de memoria de 2 GB a 4 GB evitar las excepciones de desbordamiento de pila?
¿Puede la actualización de memoria de 2 GB a 4 GB evitar las excepciones de desbordamiento de pila?
Respuesta
No. El aumento de RAM no aumenta el tamaño de la pila.
Está escribiendo un código que está causando el desbordamiento de la pila (quizás debido a la recursión) y tendrá que solucionarlo.
De hecho; la recursión infinita es la más probable. +1 –
Casi seguro no. Un desbordamiento de la pila (en lugar de una falta de memoria) significa que ha consumido el espacio asignado pila, pero la pila es (hablando relativamente) pequeña. El montón es donde todo está sucediendo ...
Opciones:
- arreglar su error bucle infinito ...
- mover los datos en un// Lista de algún almacén basado en heap gama (¿dónde está en este momento?)
- evitar recursión profunda
- evitar estructuras sobredimensionadas ... ¿tienes algunas estructuras gordas que realmente deberían ser clases? (las estructuras se copian a sí mismas si las parpadea)
- aumente el espacio de la pila si está seguro de que solo lo está volcando, y no vale la pena un refactorio grande (odio esta respuesta) - para hacer esto necesitaría engendrar su propio hilo con una pila más grande
Nota: Esta respuesta podría interpretarse como que aumentar la memoria RAM física aumentará el tamaño del almacenamiento dinámico, que no es el caso. –
Ciertamente lo hará, al menos en un sistema de 64 bits? –
El punto clave es que tiene muy poco efecto en la pila, pero (a pesar de los límites de 2 GB/3 GB de x86) todavía existe una relación entre la memoria RAM física y la memoria de proceso disponible. –
Probablemente no. Debe increase the stack size, eso es lo que dice el mensaje de error
Editar: O arregle la recursión infinita que probablemente tenga en su código.
Un desbordamiento de pila puede significar una recursión infinita O una muy anidada.
Incidentemente, si tiene métodos recursivos de cola, el x64 JITter los optimizará y no se ejecutará en desbordamientos de pila en absoluto (y su recursión infinita será ... bien infinita).
por lo que podría actualizar a un sistema operativo de 64 bits, o fijar su código a fin de no entrar en este problema (que es más probable un error de un muy profundo recursividad anidado ...)
¿Cómo es que esto solo funciona en x64? – SamB
memoria física sólo influye el rendimiento de los programas que se ejecutan en la máquina, pero no tiene nada que ver con ningún problema relacionado con la memoria de un programa (en los sistemas operativos estándar, el sistema incrustado sigue reglas diferentes).
En primer lugar, porque he visto este error muchas veces, hablemos del modelo de memoria del sistema operativo.
Casi todos los sistemas operativos de los usuarios (estoy pensando aquí en linux, windows, bsd, etc.) utilizan un modelo de memoria virtual. El modelo de memoria virtual significa que cada programa tiene acceso completo a una memoria virtual privada, es decir, una representación del almacenamiento de memoria que no tiene que tener la memoria física correspondiente.
El tamaño de esta memoria virtual es igual a la gama que puede ser dirigida por un único registro de la máquina. En sistemas operativos de 32 bits, eso significa aproximadamente 4 GB. Ahora, independientemente de la cantidad de memoria que tenga su sistema, su programa siempre pensará que tiene 4 GB.
Ahora, esos 4 GB son, de hecho, compartidos entre su programa y el espacio que el sistema operativo reserva para manejar datos en modo kernel, así como para mantener las estructuras necesarias para su programa. Siendo práctico, puede contar con aproximadamente 2 o 3 GB dependiendo de su configuración (su configuración de sistema operativo). Todo esto no tiene nada que ver con la cantidad de memoria física que tiene, puede tener 256 MB de RAM y su programa pensará que tiene 2 GB a su disposición.
Al asignar memoria, el sistema generalmente no proporciona exactamente la cantidad de memoria que pide. En su lugar, utiliza páginas, que son bloques de memoria reservada (por ejemplo, 4 KB) asignados a su proceso. Cuando hace eso, el sistema operativo registra esa "página" como asignada, pero esto todavía está en la memoria virtual. Internamente, el sistema operativo administra qué páginas se guardan en la memoria física y cuáles de ellas están en el intercambio (en el HDD). Esa es la razón por la que aumentar su RAM aumenta su rendimiento (más páginas pueden estar en la memoria principal al mismo tiempo, y debe leer menos desde el HDD) pero no ayuda con un desbordamiento de pila (o una excepción de Falta de memoria por la manera).
Y eso por qué aumentar su RAM no ayudará.
Por último, sobre la excepción de desbordamiento de pila ... Bueno, es difícil decir sin ver el código real, ya se han dado algunas buenas respuestas.
En su mayoría, el desbordamiento de pila proviene de una recursión infinita, ya sea directa o indirecta (A -> B -> C -> A) pero en su caso concreto, diría que solo está asignando mucha información en la pila.
Tiene una matriz de 70000 tamaños. Supongo que la matriz está llena de tipos de valores, que se asignan en la pila y que, si recuerdo correctamente (y no lo tomo como un hecho), es de 1 MB en .NET, que podría ser la razón por la que está recibiendo tu pila se desbordó
En realidad, no. Pero tengo una razón diferente: Windows XP solo puede manejar hasta 2 GB a menos que especifique una opción de arranque específica en boot.ini. (El parámetro/3gb). En el mejor de los casos, Windows XP y Vista llegarán a 3 GB de RAM y ese es básicamente el límite para Windows. Consulte This link para obtener más información acerca de estos límites.
El aumento de la memoria RAM y la fijación de su aplicación a ir más allá del límite de 2 GB podría arreglar su desbordamiento de pila, ya que podría aumentar el tamaño de su pila. También podría retrasar el momento del desbordamiento de la pila, ya que, como se ha sugerido, el código está en un ciclo recursivo sin fin y continuará ejecutándose hasta que se agoten los recursos.
Si usted hace uso de la recursividad, tenga esto en cuenta: cualquier cosa que lo hace mediante el uso de la recursividad puede ser reescrita sin el uso de la recursividad. No hay excepciones a esta regla, aunque el código no será más fácil de leer.
En realidad, el indicador/3Gb cambia la cantidad máxima de memoria por proceso que se puede asignar. Windows XP y Vista tomarán felizmente 4Gb de RAM pero solo permitirán el acceso a aproximadamente 3.5Gb de él, con los restantes 500Mb de espacio direccionable tomado para otra memoria como tarjetas de video, etc. –
Cierto, pero desde la perspectiva de la aplicación la aplicación aún estará limitada a 3 GB. Actualizar a 4 GB significa menos intercambio pero no más memoria para su proceso en sí. –
No sé para C#, pero en Java, significa error stackoverflow que va a crear instancia de una clase en la clase que ya han sido ejemplificada en la clase que usted está tratando de ejemplo
- 1. cómo puede JVM utilizar más de 4 GB de memoria
- 2. 1,2 GB de memoria excepción
- 3. DeflateStream 4 GB de límite en .NET
- 4. Desbordamiento de enteros en la comprobación de memory_limit detectada: ¿no se puede establecer el límite de memoria más allá de 2 gb?
- 5. ¿Por qué 2 GB de límite de memoria cuando se ejecuta en Windows de 64 bits?
- 6. archivos de asignación más grandes de 2 GB con Java
- 7. ¿pueden mis programas tener acceso a más de 4 GB de memoria?
- 8. Carga de archivos de más de 4 GB
- 9. Leyendo archivos de más de 4 GB usando C++ stl
- 10. Base de datos de más de 2 GB en MongoDB
- 11. ¿Las cadenas de C# (y otras API de .NET) están limitadas a 2 GB de tamaño?
- 12. carga Python 2 GB de archivo de texto en la memoria
- 13. ¿Por qué no puedo aprovechar 4 GB de RAM en mi computadora para procesar menos de 2 GB de información en C#?
- 14. ¿Cómo aumentar el límite de memoria para PHP de más de 2 GB?
- 15. Copia de seguridad de archivo en la parte inferior 4 GB completo
- 16. ¿Puede un programa de 32 bits usar más de 4 GB de memoria en un sistema operativo de 64 bits?
- 17. Tomcat 6.0 Carga de archivos grandes (> 2 GB)
- 18. ¿El límite de 4 GB de SQL Server Express está afectado por las columnas FILESTREAM habilitadas?
- 19. ¿Puede manejar mysql un conjunto de datos de 50 gb?
- 20. ¿Cómo habilita PAE (extensión de dirección física) un espacio de direcciones de más de 4 GB?
- 21. Cómo ordenar 100 GB de cadenas
- 22. ¿Cómo puede un proceso de Java con -Xmx1024m ocupar 3 GB de memoria residente?
- 23. ¿Subir archivos de más de 2 Gb a IIS 8/ASP.NET 4.5?
- 24. Tres horas para que GC reduzca 1,2 GB de pila, ¿cuál podría ser el motivo?
- 25. Manera eficiente de alterar la tabla de 100 GB
- 26. La aplicación C++ se bloquea una vez que el uso de memoria alcanza 1.5 GB
- 27. ¿Cómo obtener el tamaño de un archivo que es mayor a 4 Gb?
- 28. Conversión de rsync: ¿salida de estado a GB?
- 29. ¿Cuál es la mejor manera de ordenar 30 gb de cadenas con una computadora con 4 gb de RAM utilizando Ruby como lenguaje de scripting?
- 30. Evitar la memoria de la pila inicial de error de tamaño
1 por un desbordamiento de pila pregunta sobre el desbordamiento de la pila. Me dio la risa. Para –
una pregunta relacionada, consulte aquí: ;-P stackoverflow.com/questions/941952 –
Es broma ... aquí (en realidad, esta vez): http://stackoverflow.com/questions/656226/ –