2011-01-24 4 views
10

Tengo un gran conjunto de cadenas que estoy usando para la investigación del procesamiento del lenguaje natural, y me gustaría una buena manera de almacenarlo en Python.Formas de almacenar y acceder a listas grandes (~ 10 GB) en Python?

Podría usar pickle, pero cargar la lista completa en la memoria sería una imposibilidad (creo), ya que tiene unos 10 GB de tamaño y no tengo tanta memoria principal. Actualmente tengo la lista almacenada con la biblioteca de estantería ... La estantería está indexada por cadenas, "0", "1", ..., "n", que es un poco torpe.

¿Existen mejores formas de almacenar dicho objeto en un solo archivo, y aún tener acceso aleatorio (ish) a él?

Puede ser que la mejor opción sea dividirlo en varias listas.

Gracias!

Respuesta

9

Dependiendo de cómo intente 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, puede que no tengan tanto sentido. (Incluso si todo lo que tiene es un número 'id' y luego su cadena, creo que SQLite3 para el almacenamiento subyacente de sus cadenas podría ser excelente.)

Si puede encontrar algún mecanismo para agrupar sus cadenas de alguna manera que los usaría (por ejemplo, si algunas de sus oraciones tienen objetos o temas implícitos, y le gustaría investigar específicamente sobre ellas, o dependiendo de la fuente de sus cadenas, ya sea formal o informal o hiperinformal) o algo así, entonces podrías reducir el "conjunto de trabajo" de tus datos de manera significativa al particionarlos, y potencialmente mejorar drásticamente el rendimiento de tu investigación. Pero si pretendes un acceso verdaderamente aleatorio, entonces una gran pila podría ser lo mejor.

Espero que esto ayude.

+0

Supongo que una base de datos es más adecuada para este tipo de tareas. Creo que daré una oportunidad: D –

+1

Acaba de ser transferido a SQLite3. ¡El procesamiento es mucho más rápido y ocupa aproximadamente un tercio del espacio en disco de una estantería! –

+2

¡Ja! Más rápido _y_ más pequeño. Me encanta SQLite3. : D – sarnold

3

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

Con la ayuda de Object Relational Mapper (por ejemplo, sqlalchemy) puede tener una vista orientada a objetos en los datos y iterar sobre las cadenas, o trabajar con subconjuntos mayores 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 más preciso sobre los conjuntos de elementos con los que desea trabajar.

+0

No he oído hablar de sqlalchemy, pero parece interesante. –

1

Yo diría use shelve (que usa un back-end bdb) o Sqlite3.
Me gustaría ir con SQLite3, para una lista simple una tabla como CREATE TABLE list(idx int primary key, value text); debería ser suficiente.

Cuestiones relacionadas