En uno de mis proyectos paralelos actuales, estoy escaneando un texto para ver la frecuencia de trillizos de palabras. En mi primer intento, utilicé el diccionario predeterminado tres niveles de profundidad. En otras palabras, topDict[word1][word2][word3]
devuelve el número de veces que estas palabras aparecen en el texto, topDict[word1][word2]
devuelve un diccionario con todas las palabras que aparecen después de las palabras 1 y 2, etc.Alternativas de memoria eficiente a los diccionarios de Python
Esto funciona correctamente, pero requiere mucha memoria. En mis pruebas iniciales, utilizó algo así como 20 veces la memoria de simplemente almacenar los trillizos en un archivo de texto, lo que parece una gran cantidad de memoria sobrecarga.
Mi sospecha es que muchos de estos diccionarios se están creando con muchas más ranuras de las que realmente se utilizan, así que quiero reemplazar los diccionarios con otra cosa que sea más eficiente con la memoria cuando se utiliza de esta manera. Preferiría mucho una solución que permita búsquedas clave a lo largo de las líneas de los diccionarios.
Por lo que sé de las estructuras de datos, un árbol de búsqueda binaria equilibrado usando algo como rojo-negro o AVL probablemente sería ideal, pero realmente preferiría no implementarlo yo mismo. Si es posible, preferiría quedarme con las bibliotecas estándar de Python, pero definitivamente estoy abierto a otras alternativas si funcionan mejor.
Entonces, ¿alguien tiene alguna sugerencia para mí?
Editado para añadir:
Gracias por las respuestas hasta ahora. Algunas de las respuestas hasta ahora han sugerido el uso de tuplas, que realmente no me ayudó mucho cuando condensé las dos primeras palabras en una tupla. Dudo en utilizar los tres como clave, ya que quiero que sea fácil buscar todas las palabras de los dos primeros. (es decir, quiero algo así como el resultado de topDict[word1, word2].keys()
).
El conjunto de datos actual con el que estoy jugando es la versión más reciente de Wikipedia For Schools. Los resultados de analizar las primeras mil páginas, por ejemplo, son algo así como 11 MB para un archivo de texto en el que cada línea es de tres palabras y se separa la pestaña de conteo total. Almacenar el texto en el formato de diccionario Ahora estoy usando tomas de alrededor de 185MB. Sé que habrá una sobrecarga adicional para los punteros y otras cosas, pero la diferencia parece excesiva.
¿Puede proporcionar un enlace a su lista de palabras de la muestra? Wikipedia For Schools tiene descargas deshabilitadas. Su archivo de 11MB y lo que planea sacar de él (tal vez su implementación actual) sería genial para las pruebas. – Dustin