2010-04-19 23 views
7

Tengo una lista de cadenas que contienen aproximadamente 7 millones de elementos en un archivo de texto de 152 MB de tamaño. Me preguntaba cuál sería la mejor manera de implementar la función a que toma una sola cadena y devuelve si está en esa lista de cadenas.¿Coincidir una cadena en un archivo de texto grande?

Respuesta

5

¿Va a tener que coincidir con este archivo de texto varias veces? Si es así, crearía un HashSet<string>. De lo contrario, solo léelo línea por línea (supongo que hay una cadena por línea) y compruebe si coincide.

152MB de ASCII terminarán con más de 300MB de datos Unicode en la memoria, pero en las máquinas modernas tienen mucha memoria, por lo que mantener todo en un HashSet<string> hará que las búsquedas repetidas sean muy rápidas.

La absoluta forma más sencilla de hacer esto es probablemente usar File.ReadAllLines, a pesar de que va a crear una matriz que luego se desecha - no es genial para el uso de memoria, pero probablemente no es tan malo:

HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt")); 
... 

if (strings.Contains(stringToCheck)) 
{ 
    ... 
} 
+0

En realidad, tengo que buscar una y otra vez. Pero voy a usar esto en una aplicación web. ¿Se convertirá la memoria en un problema con muchas solicitudes? –

+2

@Taz: el número de solicitud es irrelevante, siempre y cuando construya su hashmap solo una vez :) De acuerdo con la documentación: * Cualquier miembro estático público de este tipo es seguro para subprocesos *, por lo que no hay problema aquí, también – tanascius

+0

@Taz : tanascius tiene razón Cargalo una vez y deberia poder buscar (usando multiples hebras concurrentes, incluso - mientras nada este escribiendo en el) sin uso de memoria extra. Siempre que su servidor web tenga suficiente memoria para guardar el conjunto, ese es el camino a seguir. –

3

depende de lo que quieras hacer. Cuando desee repetir la búsqueda de coincidencias una y otra vez, cargaré todo el archivo en la memoria (en un HashSet). Allí es muy fácil buscar coincidencias.

Cuestiones relacionadas