2011-10-19 21 views
6

Numerosas fuentes que he encontrado sugieren que el tamaño de las matrices para el código VBA depende de la cantidad de memoria en la máquina. Sin embargo, este no ha sido el caso para mí. Estoy ejecutando el siguiente, muy simple, el código de prueba:Límite de tamaño de matriz VBA de Excel 2007

Sub test6() 
Dim arr(500, 500, 500) As Boolean 
End Sub 

Sin embargo, si cambio el tamaño de 600x600x600 sea, me sale un error de falta de memoria. La máquina que estoy usando tiene 16 Gb de RAM, así que dudo que la RAM física sea el problema.

Estoy usando Excel 2007. ¿Hay algún truco para hacer que VBA use más memoria RAM?

Respuesta

3

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.

+0

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

+0

_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

+0

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

0

Como @paxdiablo mencionó el tamaño de la matriz es de aproximadamente 400+ Mb, con un máximo teórico de 2 Gb para Excel de 32 bits. Lo más probable es que las macros de VBA estén limitadas en el uso de la memoria. También el bloque de memoria para la matriz debe ser un bloque contiguo de memoria que hace que la asignación sea aún más difícil. Por lo tanto, es posible que pueda asignar diez matrices de 40 Mb de tamaño, pero no una de 400 Mb de tamaño. Revisalo.

+0

no debería asignar bloques de memoria de desplazamiento para crear un espacio contiguo? Toma tiempo, pero no creo que arroje un error de falta de memoria – Juliusz

4

Después de haber realizado algunas pruebas, parece que hay un límite de aproximadamente 500 MB para VBA de 32 bits y de aproximadamente 4 GB para VBA de 64 bits (Excel 2010-64).
No sé si estos límites de VBA disminuirán si está utilizando una gran cantidad de libro/memoria dinámica dentro de la misma instancia de Excel.

+0

que parece que también se trata de lo que estaba obteniendo, gracias. Podría intentar y ver si podemos obtener la versión de 64 bits: ¡haga uso de la máquina de 64 bits que se compró pero que rara vez se usa! – Farthingworth

Cuestiones relacionadas