[ Foro de C ]

Arreglo ridículamente grande...

27-Jun-2008 19:09
Carlos Ruiz
8 Respuestas

Holap:

Estoy haciendo un programa en el que necesito un arreglo extremadamente grande:

long int arreglo[200000000];

A mi juicio, no debería haber problema alguno si se dispone de la suficiente memoria (tengo 2GBytes).
Lo que pasa es que el programa funciona perfectamente, pero "a veces" se cae sin motivo aparente... y yo presumo que puede ser consecuencia de usar este arreglo...

Por eso, estimado Nacho Cabanes (o quien quiera ayudarme... : ), podría usted decirme algo al respecto, por favor?

(Qué pasa en la RAM?
Cómo administra semejante arreglo el SO?
Qué pasa con la paginación de memoria?
etc, etc...?
Leeré atentamente lo que Ud. considere relevante para esta situación.)

Muchas gracias de antemano : )
Saludooos.
Carlos.


P.D: Lo felicito nuevamente por su invaluable labor... Ud. contribuye notablemente en la difusión y la incrementación del conocimiento.



28-Jun-2008 13:48
Jose carlos Gonzalez Tassani

- Yo diria que tu problema es de reserva de memoria, tienes que aprender si no sabes ya...

- A manejar arrays (arreglos) dinamicamente, con Calloc, Malloc, Realloc, es lo mejor paras arrays que en principio no sabes cuanto espacio concreto vas a usar, sino puede que te de problemas de reserva de memoria.

- es un consejo, haber que dicen los demas ;) taluego. Suerte....


28-Jun-2008 20:31
Carlos Ruiz

Gracias por tu ayuda, pero necesito un arreglo de exactamente ese tamaño (pues usaré cada uno de esos long int del arreglo) por lo que no es necesario usar memoria dinámica. Además, las funciones malloc() y free() son muy "lentas".

Lo que me interesa saber es qué problema puede implicar el uso de un arreglo tan grande... (como decía en el primer post, si uno dispone de la suficiente memoria no debería haber problema alguno, cierto?).

Saludoos.



28-Jun-2008 23:43
Nacho Cabanes (+32)

En primer lugar:

long int arreglo[200000000]; sí es un array bastante grande. No dices qué sistema operativo usas, ni qué compilador, pero si suponemos que ambos son de 32 bits, esa matriz (arreglo) ocuparía 800 Mb. No llena por completo tus 2 Gb, pero sí puede dar problemas en sistemas operativos "hambrientos", como Windows Vista.

Aun así, si el sistema operativo es mínimamente eficiente, paginará en disco si es necesario, de forma que debería dejarte usar arrays así de grandes, aunque quizá los maneje a mucha menos velocidad que arrays más pequeños.

En principio, yo supondría que el sistema operativo "no es malo" y que el compilador que empleas no tiene "bugs" (o casi). En ese caso, debería manejar sin problemas arrays de casi cualquier tamaño... o dar un error en tiempo de compilación si es demasiado grande.

Por eso, yo achacaría más el fallo a tu programa que al array. El problema más habitual en el manejo de arrays es el acceder a un índice no válido (y, por tanto, leer o escribir fuera de la zona de memoria que has reservado).

Para descartar problemas, crea un mini-programa que sólo tenga definido ese array, lo recorra con un "for" para escribir un dato en cada posición, y/o acceda a las posiciones críticas (primera y última, sobre todo). Si ese programa funciona bien, el "completo" también debería... salvo que exista un fallo... en otra parte (eso es lo habitual).



29-Jun-2008 00:14
Carlos Ruiz

Holap:

Muchas gracias por su ayuda.

Los SO's que estoy usando son Windows XP y Xubuntu 7.04. En Windows estoy trabajando con el ide dev-cpp (no sé cual es el compilador "debajo" de ese ide) y en Xubuntu uso geany con las herramientas del metapaquete "build-essential".

Hice lo que me recomendó Nacho Cabanes y el mini programa funciona a la perfección.

Entonces finalmente, en teoría no debería haber problemas con semejante arreglo?

Saludoos y gracias por todo nuevamente sonrisa

Carlos.

P.D: Cualquier otra información sobre este problema es absolutamente bienvenida guiño

29-Jun-2008 12:48
Nacho Cabanes (+32)

No, no debería haber problemas con usar un "array grande", si te permite compilarlo con ese tamaño (tamaño admisible para el compilador) y no da un error de ejecución nada más inicializar el programa (tamaño soportable por el sistema operativo).

La prueba es que el mini-programa funciona bien, por lo que el fallo está en otro lado. Prueba a depurar poco a poco hasta que lo encuentres, bien sea "depurando de verdad" (con gdb o el depurador integrado en Dev-C++) o bien a base de "printf que te digan por qué parte del programa pasas o qué operación acabas de hacer, porque tiene toda la apariencia de que en algún momento accedas fuera del array, con lo que el resultado de la operación es indeterminado (sobre todo en Windows ;-) ). A veces "parecerá que lo hace bien" y otras veces fallará estrepitosamente.

En cuanto a lo que dice Carlos, la memoria dinámica es casi imprescindible cuando no sabes cuánto espacio necesitarás, pero si en tu caso tienes claro que necesitas exactamente 200.000.000 elementos (aunque asusta, suena a poco eficiente), es mejor usar memoria estática por:

- Es mucho más rápida de acceder (datos contiguos).
- Aprovecha mucho mejor el espacio (no hay punteros al dato anterior y al siguiente, por lo que un array puede ocupar cerca de la tercera parte en este caso que una lista simplemente enlazada, y la quinta parte que una lista doble o un árbol binario de búsqueda).
- Es más sencilla de manejar, lo que supone una menor probabilidad de errores.

Aun así, ya has visto que algún error se ha colado por ahí...


29-Jun-2008 18:49
Carlos Ruiz

Holap:

Muchísimas gracias por su ayuda!
Ahora tengo todo mucho más claro risarisa

Espero que este sitio web nunca se cierre, realmente es un gran aporte al conocimiento.

Saludooos.
Carlos.


P.D: El otro día traté de inscribirme al curso "Linux y bash", pero apareció una página que decía que la inscripción de cursos está deshabilitada... ¿Será habilitada nuevamente o desde ahora los cursos son "libres"?

22-Jul-2008 13:21
Nacho Cabanes (+32)

Sobre el curso de Linux y Bash... me sorprendería que la inscripción estuviera deshabilitada. Puedes mandar un mensaje a Javier Hernández, que es su creador y coordinador.

Aunque... recuerda que para leer el curso no necesitas estar inscrito, sólo para participar en foros o hacer ejercicios propuestos.


22-Jul-2008 20:06
Carlos Ruiz

Holap:

Creo que fue un problema temporal, pues al otro día intenté inscribirme de nuevo y no hubo problema alguno...

Saludooos :)








(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)