Sería bueno si había una función Application.UseMoreMemory()
que pudiéramos llamar :-)
Por desgracia, no conozco ninguno.
Todos los documentos que he visto dicen que está limitado por la memoria, pero no es la memoria física el problema, es el espacio de direcciones virtual que tiene disponible para usted.
Debe tener en cuenta que, aunque el aumento de 500 a 600 solo parece un aumento moderado (aunque el 20% es lo suficientemente grande por sí solo), porque lo hace en tres dimensiones, funciona para estar cerca del doble de los requisitos de almacenamiento.
De la memoria, Excel 2007 usó enteros cortos (16 bits) para el tipo booleano, por lo que, como mínimo, su matriz 500 ocupará unos 250M (500x500x500x2).
Aumentar todas las dimensiones a 600 le daría 600x600x600x2, o aproximadamente 432M.
Todo bien dentro del espacio de direcciones utilizable 2G que es probable que tenga en una máquina de 32 bits (que no sé que Excel 2007 tenía una versión de 64 bits), pero estas cosas son no pequeña, y también debes compartir ese espacio de direcciones con otras cosas.
Sería interesante ver en qué punto comenzó obteniendo los errores.
Como primer paso, estaría investigando la necesidad de una matriz tan grande. Puede ser posible de otra manera, como particionar la matriz de manera que solo una parte esté en la memoria en un momento dado (tipo de memoria virtual manual).
Es poco probable que funcione tan bien para un acceso realmente aleatorio, pero no debería ser tan malo para un acceso más secuencial y al menos te ayudará a avanzar (una solución lenta es preferible a una no operativa).
Otra posibilidad es abstraer el manejo de bits para que sus booleanos se almacenen realmente como bits en lugar de palabras.
Debería proporcionar funciones para getBool
y setBool
, utilizando operadores de máscara de bits en una matriz de palabras y, una vez más, el rendimiento no sería tan alto, pero al menos podría subir hasta el equivalente de:
' Using bits instead of words gives 16 times as much. '
Dim arr(8000, 8000, 8000) As Boolean
Como siempre, depende de lo que necesite la matriz y sus patrones de uso.
El aumento de 500 a 600 fue solo un trabajo duro que hice. Básicamente, estamos tratando de utilizar Excel para algo que realmente no fue diseñado por desgracia, pero la fecha límite es la próxima semana, ¡así que realmente no podemos cambiar ahora! Gracias por los pensamientos, seguiré enchufándome para ver a dónde van las cosas. – Farthingworth
_Antes de seguir frenando, es posible que desee asegurarse de que se notifique a la administración este posible retraso. A ellos realmente no les gustan las sorpresas :-) – paxdiablo
Nota rápida sobre su idea de usar bits en lugar de booleanos, yo estaba usando booleanos solo para mi prueba, en nuestro trabajo real estamos usando estructuras que contienen un montón de datos sobre el proceso, entonces obtenemos mucho menos de lo que podemos obtener con bools. Ya he reducido estos valores tanto como sea posible por desgracia = ( – Farthingworth