• Viernes 8 de Noviembre de 2024, 20:52

Autor Tema:  array muy grande  (Leído 2182 veces)

kaskade

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
array muy grande
« en: Lunes 22 de Noviembre de 2010, 23:58 »
0
Hola, Buenas noches.

Tengo un problema a la hora de crear un array bidimensional en C.

Necesito que el array guarde secuencias de números, pero el número de secuencias puede ser de varios miles de millones. Entiendo que ese 'varios miles de millones' no puede ser un int pero los números de las secuencias que guardará sí son int. Incluso si pruebo a usar punteros ( lo sé, es lo debería hacer, espero no tener que reescribir todo el programa ) tampoco puedo guardar en un número miles de millones de punteros ...

El caso es que necesito saber en todo momento cuántas secuencias llevo guardadas, así que sí me interesa guardar el número de secuencias ... pero no sé cómo hacerlo.

Espero haberme explicado.

Un saludo y muchas gracias de antemano!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: array muy grande
« Respuesta #1 en: Martes 23 de Noviembre de 2010, 01:51 »
0
Puedes dividirlo en un array de arrays bidimensionales (un array tridimensional) por ejemplo.

kaskade

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: array muy grande
« Respuesta #2 en: Martes 23 de Noviembre de 2010, 02:08 »
0
O sea que, cada X arrays bidimensionales, cambie de elemento en el array de arrays ... así iría rellenando por ejemplo 'ints' y cada elemento del array de arrays serían 32768 arrays bidimensionales ... ¿te refieres a eso?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: array muy grande
« Respuesta #3 en: Martes 23 de Noviembre de 2010, 10:20 »
0
Sí, pero creo que te estás confundiendo en otro tema. Que un array sea de tipo int no significa que sólo soporte 32768 elementos. Eso es el rango de cada elemento (si lo declaras como unsigned int tienes el doble de rango de número positivos pero sin números negativos). El array puede ser todo lo grande que quieras (hasta el máximo que permita size_t creo recordar). Por ejemplo:

Código: C
  1. // Reservando 2 GiB de memoria
  2. int* a = (int*)malloc(0x80000000);
  3.  
  4. // Comprobando que malloc() ha reservado la memoria requerida
  5. if (a == NULL)
  6. {
  7.     // Tratamiento de error
  8. }
  9. else
  10. {
  11.     // Inicializando el bloque con datos (ojo que puede llevar tiempo)
  12.     int i;
  13.     for (i = 0; i<0x80000000; i+=sizeof(int))
  14.     {
  15.         a[i] = i;
  16.     }
  17. }
  18.  
Aquí reservas 2 GiB de memoria y los rellenas con diferentes números. También puedes usar memset() si vas a tener grandes cachos de memoria con un mismo valor.

Saludos

kaskade

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: array muy grande
« Respuesta #4 en: Martes 23 de Noviembre de 2010, 17:18 »
0
Vaaaaaaale, probablemente me topo con la limitación de size_t. 1 millón me deja pero 10 millones ya no.

No es tan crítico guardar los datos como ir sabiendo esa cantidad en concreto, pero sé que tarde o temprano tendré que acabar guardando los datos para usarlos.

Muchas gracias por la respuesta !!!!

Un saludo!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: array muy grande
« Respuesta #5 en: Martes 23 de Noviembre de 2010, 18:24 »
0
Cita de: "kaskade"
10 millones ya no.
10 millones entra de sobra. El número que te he puesto arriba (0x80000000) son 2.147.483.648. size_t en sistemas de 32 bits acepta hasta 4.294.967.295.

Saludos

kaskade

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: array muy grande
« Respuesta #6 en: Miércoles 24 de Noviembre de 2010, 03:57 »
0
Pues no sé por qué recuerdo que no me dejaba declarar el array con 10000000 ... bueno, lo probaré otra vez para cerciorarme y, si estoy equivocado y realmente me soporta 4GB, probaré a reservarlo a mano tal como me has puesto ahí.

Muchas gracias por la respuesta !

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: array muy grande
« Respuesta #7 en: Miércoles 24 de Noviembre de 2010, 09:03 »
0
Pero siempre asegúrate de que el SO te acepta la petición, tal y como te he puesto en el ejemplo. Y siempre solicita la memoria que vayas a utilizar, no toda la disponible "por si acaso". Si no sabes cuánta memoria total vas a usar, haz malloc() sólo de la que estés seguro y después puedes usar realloc() para agrandar ese mismo bloque.

Suerte con ello.

hardyx

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: array muy grande
« Respuesta #8 en: Miércoles 1 de Diciembre de 2010, 11:56 »
0
Deberías usar punteros o estructuras para guardar esos números sin tener que reservar toda la memoria. Por ejemplo, yo usaría un array bidimensional de listas de números (std::list<int> en STL). Pero esa cantidad tan enorme de números creo que deberías guadarla en un fichero o en una base de datos, en vez de saturar la memoria. Pero depende del proceso que vayas a realizar. Si es un cálculo intesivo quizá es mejor que estén en memoria, pero usando una tabla funcionará en cualquier ordenador.