2011-04-01 15 views
6

Quiero usar un mapa o diccionario de búsqueda en una aplicación C#, pero se espera que almacene 1-2 GB de datos.¿Cómo puedo usar un diccionario muy grande en C#?

¿Alguien puede decir si todavía podré usar la clase del diccionario, o si necesito usar alguna otra clase?

EDITAR: Tenemos una aplicación existente que utiliza la base de datos Oracle para consultar o buscar detalles del objeto. Sin embargo, es demasiado lento, ya que los mismos objetos son consultados repetidamente. Sentía que sería ideal usar un mapa de búsqueda para este escenario, para mejorar el tiempo de respuesta. Sin embargo me preocupa si el tamaño hará que sea un problema

+0

¿Ha intentado hacer girar una instancia de un diccionario que usa tanta memoria? Además, ¿esta aplicación se implementará en un sistema de 32 o 64 bits? – RQDQ

+1

¿Por qué un diccionario o una estructura de datos en memoria? ¿Por qué no una base de datos? –

+2

SqlLite tiene un db fresco en la memoria que puede ser interesante para su situación. – gt124

Respuesta

7

respuesta Corto

Sí. Si su máquina tiene suficiente memoria para la estructura (y la sobrecarga del resto del programa y del sistema, incluido el sistema operativo).

Respuesta larga

¿Seguro que deseas? Sin saber más acerca de su aplicación, es difícil saber qué sugerir.

  • ¿De dónde provienen los datos? ¿Un archivo? ¿Archivos? Una base de datos? ¿Servicios?
  • ¿Es esto un mecanismo de almacenamiento en caché? Si es así, ¿puede caducar elementos de la memoria caché una vez que no se ha accedido por un tiempo? De esta manera, no tiene que mantener todo en la memoria todo el tiempo.
  • Como otros han sugerido, si solo intenta almacenar muchos datos, ¿puede simplemente usar una base de datos? De esta forma, no es necesario tener toda la información en la memoria a la vez. Con la indexación, la mayoría de las bases de datos son excelentes para realizar recuperaciones rápidas. Podría combinar este enfoque con un caché.
  • ¿Los datos que estarán en la memoria son de solo lectura, o tendrá que conservarse en algún lugar de almacenamiento cuando algo cambie?
  • Escalabilidad: ¿cree que la cantidad de datos que se almacenarán en este diccionario aumentará con el paso del tiempo?Si es así, te encontrarás con un punto donde es muy costoso comprar máquinas que puedan manejar esta cantidad de datos. Es posible que desee buscar un sistema de caché distribuido si este es el caso (AppFrabric viene a la mente) para que pueda escalar horizontalmente (más máquinas) en lugar de verticalmente (un punto de falla realmente grande y costoso).

ACTUALIZACIÓN

A la luz de la edición del cartel, que suena como el almacenamiento en caché que recorrer un largo camino hasta aquí. Hay muchas maneras de hacer esto:

  • Almacenamiento en caché simple del diccionario: simplemente guarde las cosas en la memoria caché según lo solicitado.
  • Memcache
  • Caching Application Block No soy un gran admirador de esta implementación, pero otros han tenido éxito.
0

Puede, pero un diccionario tan grande como que es mejor usar una base de datos

1

Mientras estás en una máquina de 64 GB, sí que debiera ser capaz de usar ese gran diccionario. Sin embargo, si tiene MUCHOS datos, una base de datos puede ser más apropiada (cassandra no es más que un diccionario gigantesco, y siempre hay MySQL).

+1

Solo una nota al margen ... la aplicación necesita ser compilada a 64 bits (o cualquier CPU en la máquina de 64 bits) para que el proceso ocupe más de 2GB de memoria (creo que son 2GB de todos modos). –

1

Cuando dice 1-2GB de datos, supongo que quiere decir que los elementos son objetos complejos que acumulativamente contienen 1-2GB.

A menos que sean estructuras (y no deberían serlo), al diccionario no le importa qué tan grandes sean los artículos.
Mientras tenga menos de aproximadamente 2 elementos (saqué ese número de un sombrero), puede almacenar todo lo que pueda caber en la memoria.

Sin embargo, como todos los demás han sugerido, probablemente debería usar una base de datos.
Es posible que desee utilizar una base de datos en memoria como SQL CE.

0

Utilice una base de datos. Asegúrate de tener un buen modelo de base de datos, poner los índices correctos y listo.

-2

Puede usar subdictionaries.

Dictionary<KeyA, Dictionary<KeyB .... 

Dónde KeyA es una parte común de KeyB.

Por ejemplo, si tiene un diccionario String, puede usar la Primera letra como KeyA.

+0

¿Cómo responde esto la pregunta? Esto parece un esquema de partición de caché oscuro y no tiene nada que ver con responder si el usuario debe almacenar en caché los resultados de una base de datos. – RQDQ

+0

Resuelve un problema, sí, es un esquema de partición (problema con los diccionarios: asignación de memoria, cuando la memoria termina asigna dos veces más memoria y el uso de un esquema de partición puede hacer que el proceso no sea tan doloroso), y parece que es la única forma en que quiero tener un gran diccionario en la RAM (no en la base de datos), por supuesto si tienes mucha RAM, o obtendrás FUERA DE LA MEMORIA. También puede intentar cambiar su aplicación a 64 bits; tal vez debería ser lo primero que debería intentar ... –

Cuestiones relacionadas