2012-03-02 44 views
9

Recientemente, trabajo en C++ y tengo que crear un array[60.000][60.000]. Sin embargo, no puedo crear esta matriz porque es demasiado grande. Intenté float **array o incluso static float array, pero nada es bueno. ¿Alguien tiene ideas? ¡Gracias por tus ayuda!Crear una matriz demasiado grande en C++, ¿cómo resolverlo?

+0

Si realmente necesita una matriz tan grande, le sugiero que busque usando un archivo mapeado en la memoria. Su sistema operativo solo asignará las páginas a las que acceda si no puede incluir todo en la memoria. –

+0

Además, * estás * en un sistema operativo de 64 bits, ¿verdad? –

+0

Sí, estoy usando Windows 64-bits –

Respuesta

15

Una matriz de tamaño 60,000 x 60,000 tiene 3,600,000,000 elementos.

Usted está utilizando el tipo de float por lo que se convierte en:

60,000 x 60,000 * 4 bytes = 14,400,000,000 bytes ~= 13.4 GB 

qué tienes esta cantidad de memoria en su máquina?


Tenga en cuenta que el problema de la pila frente al montón ni siquiera importa a menos que tenga suficiente memoria para empezar.


He aquí una lista de posibles problemas:

  • Usted no tiene suficiente memoria.
  • Si la matriz se declara globalmente, excederá el tamaño máximo del binario.
  • Si la matriz se declara como una matriz local, entonces volará su pila.
  • Si está compilando para 32 bits, ha superado con creces el límite de direcciones de 2 GB/4 GB.
+0

en realidad, tengo 20 GB! –

+0

¿Cómo falla? ¿Mensaje de error? ¿Choque? – Mysticial

+0

"Esta aplicación ha solicitado que Runtime lo finalice de una manera inusual". Yo uso devC y es lo que obtuve zzz. –

1

para inicializar la matriz 2D de flotadores que desee, tendrá que:

60000 * 60000 * 4 bytes = 14400000000 bytes

que es de aproximadamente 14 GB de memoria. Eso es MUCHA memoria. Para sostenerlo teóricamente, necesitarás ejecutar una máquina de 64 bits, sin mencionar una con bastante RAM instalada.

Además, asignar esta cantidad de memoria casi nunca es necesario en la mayoría de las situaciones, ¿está seguro de que no se pueden hacer optimizaciones aquí?

EDIT:

A la luz de la nueva información de sus comentarios sobre otras respuestas: es suficiente con 4 GB de memoria (RAM). Por lo tanto, su sistema operativo tendrá que buscar al menos 9 GB en el Disco Duro, en realidad probablemente más. Pero también solo tienes 20 GB de espacio en disco duro. Esto apenas es suficiente para buscar toda esa información, especialmente si el disco está fragmentado. Finalmente, (podría estar equivocado porque no ha declarado explícitamente) es bastante posible que esté ejecutando una máquina de 32 bits. Esto realmente no es capaz de manejar más de 4GB de memoria a la vez.

1

Asigne la memoria en tiempo de ejecución; considere la posibilidad de utilizar un archivo mapeado en la memoria como respaldo. Como todo el mundo dice, 14 conciertos son una gran cantidad de memoria. Pero no es irrazonable encontrar una computadora con 14 GB de memoria, ni es irracional pasar la memoria a la memoria según sea necesario.

Con una matriz de este tamaño, es probable que tenga mucha curiosidad sobre el rendimiento de acceso a la memoria. Recuerde considerar el grano de la memoria caché de su arquitectura de destino y si su objetivo tiene un TLB, es posible que pueda usar páginas más grandes para aliviar la presión de TLB.Por otra parte, si no tienes suficiente memoria, es probable que solo te importe cuán rápido sea tu E/S de almacenamiento.

Si no es ya obvio, necesitará una arquitectura que admita un espacio de direcciones de 64 bits para acceder a esta memoria de forma directa y conveniente.

+0

Un archivo mapeado de memoria "muerde" en el espacio de direcciones de la memoria virtual del proceso. Por lo tanto, un proceso de 32 bits no podrá acceder a más de 2 GB (o 4 GB cuando tenga "gran espacio de direcciones") en un momento, incluso con archivos mapeados en la memoria. El proceso de 64 bits lo hará, pero también será capaz de direccionar esa cantidad de memoria directamente, lo que frustra el propósito de usar un archivo mapeado en la memoria. OTOH, si el objetivo es cargar selectivamente archivos físicos reales según sea necesario, sin mapear demasiado el archivo en un momento dado, entonces el archivo asignado a la memoria es apropiado. –

2

¿Significa "60,000" en realidad "60000"? Si es así, el tamaño de la memoria requerida es 60000 * 60000 * sizeof(float), que es aproximadamente 13.4 GB. Un proceso típico de 32 bits está limitado a solo 2 GB, por lo que está claro por qué no encaja.

Por otro lado, no veo por qué no debería poder incluir eso en un proceso de 64 bits, suponiendo que su máquina tenga suficiente RAM.

+0

yeap, tengo> 20GB HDD y 4GB ram –

+0

@Kingfisher 4GB de ram? ¿Entonces confías en el intercambio?!?!? – Mysticial

+0

@Kingfisher - Ese es su problema - confunde la memoria (RAM) con el espacio en el disco duro, que son cosas diferentes. –

Cuestiones relacionadas