Pregunta

Tengo un gran conjunto de cuerdas que estoy usando para la investigación del procesamiento del lenguaje natural, y me gustaría una buena manera de almacenarlo en Python.

Podría usar Pickle, pero cargar toda la lista en la memoria sería imposible (creo), ya que es de aproximadamente 10 GB grande, y no tengo tanta memoria principal. Actualmente tengo la lista almacenada con la biblioteca de Shelve ... el estante está indexado por las cuerdas, "0", "1", ..., "n" que es un poco torpe.

¿Hay formas más bonitas de almacenar dicho objeto en un solo archivo y aún tener acceso aleatorio (ISH)?

Puede ser que la mejor opción sea dividirlo en múltiples listas.

¡Gracias!

¿Fue útil?

Solución

Dependiendo de cómo tenga la intención de obtener los datos, SQLITE3 podría ser el mejor enfoque. SQLITE3 es excelente en el acceso aleatorio a datos relacionales, pero si sus datos no son muy relacionales, es posible que no tenga tanto sentido. (Incluso si todo lo que tiene es un número de 'ID' y luego su cadena, creo que SQLITE3 para el almacenamiento subyacente de sus cuerdas podría ser genial).

Si puede descubrir algún mecanismo para agrupar sus cuerdas de alguna manera que las use (por ejemplo, si algunas de sus oraciones tienen objetos o sujetos implícitos, y desea investigar sobre ellas específicamente; o dependiendo de La fuente de sus cuerdas, ya sea formal, informal o hiperinformal) o algo así, entonces podría reducir el 'conjunto de trabajo' de sus datos significativamente al dividirlos y mejorar potencialmente drásticamente el rendimiento de su investigación. Pero si tiene la intención de tener un acceso verdaderamente aleatorio, una gran pila podría ser mejor.

Espero que esto ayude.

Otros consejos

Podría considerar usar una base de datos; Tal vez una oración o tabla de cadenas con una fila para cada cadena.

Con la ayuda de algún mapeador relacional de objetos (por ejemplo sqlalquímica) Puede tener una vista orientada a objetos sobre los datos e iterar sobre las cadenas, o trabajar con subconjuntos más grandes de sus datos secuencialmente (si eso es aplicable para su tarea).

Además, puede almacenar datos adicionales para cada oración para obtener un control de grano más fino sobre los conjuntos de elementos con los que desea trabajar.

Yo diría que use Shelve (que usa un BDB Backend) o SQLite3.
Iría con SQLITE3, para una lista simple de una tabla como CREATE TABLE list(idx int primary key, value text); debería ser suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top