Esta pregunta se ha hecho muchas veces. Después de pasar algún tiempo leyendo las respuestas, he hecho un poco de perfiles rápida para probar los diferentes métodos mencionados anteriormente ...Búsqueda de una cadena en un archivo de texto grande: creación de perfiles de varios métodos en python
- Tengo un archivo 600 MB con 6 millones líneas de cuerdas (Categoría caminos del proyecto DMOZ).
- La entrada en cada línea es única.
- Quiero carga el archivo vez & seguir buscando de partidos en los datos
Los tres métodos que he intentado debajo de la lista el tiempo necesario para cargar el archivo, el tiempo de búsqueda para un partido uso & recuerdo negativo en el administrador de tareas
s
1) set :
(i) data = set(f.read().splitlines())
(ii) result = search_str in data
tiempo de carga a ~, ~ 0.0s Tiempo de búsqueda, uso de memoria ~ 1,2 GB
2) list :
(i) data = f.read().splitlines()
(ii) result = search_str in data
stiempo de carga ~ 6s, el tiempo de búsqueda ~ 0.36s , Uso de memoria ~ 1.2GB
3) mmap :
(i) data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
(ii) result = data.find(search_str)
tiempo de carga a ~, ~ 5.4s Tiempo de búsqueda, uso de memoria ~ NA
4) Hash lookup (using code from @alienhard below):
Tiempo de carga ~ 65 años, Tiempo de búsqueda ~ 0.0s, uso de memoria ~ 250MB
0s 0s
5) File search (using code from @EOL below):
with open('input.txt') as f:
print search_str in f #search_str ends with the ('\n' or '\r\n') as in the file
tiempo de carga a ~, ~ 3.2s Tiempo de búsqueda, Uso de memoria ~ NA
6) sqlite (with primary index on url):
tiempo de carga ~, Buscar tiempo ~ 0.0s, uso de memoria ~ NA
Por mi caso de uso, parece ir con el conjunto es la mejor opción, siempre y cuando tengo suficiente memoria disponible. Tenía la esperanza de obtener algunos comentarios sobre estas preguntas:
- Una alternativa mejor por ejemplo, sqlite?
- Formas de mejorar el tiempo de búsqueda utilizando mmap. Tengo una configuración de 64 bits. [editar] p. Ej. filtros de floración
- A medida que el tamaño del archivo crece a un par de GB, ¿hay alguna manera de seguir usando el "conjunto", p. dividirlo en lotes ..
[Editar 1] P.S. Necesito buscar frecuentemente, agregar/eliminar valores y no puedo usar una tabla hash sola porque necesito recuperar los valores modificados más adelante.
¡Cualquier comentario/sugerencia es bienvenida!
[editar 2] Actualizar con los resultados de los métodos sugeridos en las respuestas [editar 3] UPDATE con resultados sqlite
solución: Sobre la base de toda la retroalimentación de perfiles &, creo que voy a ir con SQLite. La segunda alternativa es el método 4. Una desventaja de sqlite es que el tamaño de la base de datos es más del doble del archivo csv original con direcciones URL. Esto se debe al índice principal en la url
¿Están las cadenas ordenadas? – senderle
¿Necesita buscar muchas cadenas en el archivo, o solo una cadena, una vez o alguna otra cosa? – EOL
@senderle No. @EOL: Necesito buscar repetidamente cadenas y agregar nuevas. Actualizaré la publicación original – Medorator