2010-08-09 14 views
13

Tengo algunos enormes registros de controladores binarios (alrededor de 2-5GB cada uno, y probablemente alrededor de 10 veces más después de convertirlos a una forma legible) y tengo que escribir una herramienta que me permita para examinarlos, ordenarlos, buscarlos y filtrarlos de forma secuencial (con el fin de encontrar y resolver errores).Biblioteca/estructura de datos para manejar datos enormes

Cada entrada de registro tiene algunos atributos como: marca de tiempo, tipo, mensaje, algunos GUID. Las entradas son homogéneas, sin relaciones, no es necesario almacenar los datos después de "inspeccionarlos".

Realmente no sé cómo manejar tantos datos. Mantener todo en la memoria sería una tontería, lo mismo ocurre con mantener los datos en un archivo plano. Pensé en usar DBMS pequeños como SQLite, pero no estoy seguro si será lo suficientemente rápido y no necesito muchas características de DMBS, solo ordenar y buscar. En este caso, me gustaría intercambiar con entusiasmo espacio por velocidad, si es posible.

¿Hay alguna biblioteca (o tal vez estructura de datos) que me ayude a manejar tales cantidades de datos?

RDBMS "servidos" como Postgre, MSSQL, MySQL están fuera de cuestión, la herramienta debe ser fácil de usar en cualquier lugar sin ningún tipo de molestia.

EDIT: ¿Alguien sabe si el modo ": memory" de SQLite tiene alguna restricción en el tamaño de DB o simplemente llenará la memoria virtual hasta que se llene por completo?

+0

¿Por qué se descartan los gustos de PgSQL y MySQL? No requiere mucho esfuerzo configurarlos. – quantumSoup

Respuesta

11

Consulte STXXL - Biblioteca de plantillas estándar para juegos de datos extragrandes.

"El núcleo de STXXL es una implementación de la biblioteca de plantillas estándar C++ STL para cálculos de memoria externa (fuera del núcleo), es decir, STXXL implementa contenedores y algoritmos que pueden procesar grandes volúmenes de datos que solo caben en discos Si bien la compatibilidad con el STL admite la facilidad de uso y la compatibilidad con las aplicaciones existentes, otra prioridad de diseño es el alto rendimiento ".

Además, si puede dedicar varias computadoras para la tarea, marque Hadoop. Especialmente HBase, Hive y MapReduce.

+0

Esto parece interesante; ¿Alguna información sobre los tiempos de las operaciones con datos grandes? – kurczak

+0

STXXL tiene información sobre el rendimiento en http://algo2.iti.kit.edu/dementiev/stxxl/report/node11.html. Me temo que no puedo decirte mucho más. –

6

Creo que almacenar esto en un DBMS es el enfoque adecuado. La ordenación y la búsqueda son tareas que los DB destacan por su desempeño, y con esta cantidad de datos, usar una herramienta diseñada para ese fin será una gran ventaja.

SQLite funcionaría bien para esto, aunque un datastore no relacional puede usar menos espacio. Sin embargo, si desea buscar en varias "entradas", una base de datos es definitivamente el camino a seguir.

+0

De [Usos apropiados para SQLite] (http://www.sqlite.org/whentouse.html), no parece manejar grandes conjuntos de datos es el fuerte de SQLite. – quantumSoup

+0

@quantumSoup: la página de SQLite hace referencia a bases de datos que se aproximan a 2 ** tebibytes **, muy por encima de las especificaciones aquí. Por supuesto, las enormes bases de datos se manejan mejor con el DBMS de clase empresarial, sin embargo, SQLite debería manejar bien los DB de varios GB. –

+0

SQLite almacena toda la base de datos en un solo archivo y, por lo tanto, también puede encontrarse con la limitación del sistema de archivos en el tamaño máximo de archivo. – quantumSoup

2

Recomiendo usar alguna implementación de MapReduce, quizás Hadoop o algo similar. No he tenido la oportunidad de trabajar con Hadoop más allá de una presentación teórica que me dieron, pero parece prometedor.

Una alternativa es utilizar herramientas comerciales, como Splunk.

+0

Lo necesito localmente en una computadora, no hay configuraciones complicadas. – kurczak

3

¿Qué tal si usamos algún tipo de E/S mapeada en memoria, algo así como Java MappedByteBuffer y lanzamos su propia herramienta?

Parafraseando a partir de una respuesta para el MBBs,

Básicamente, este mecanismo utiliza el sistema de paginación de memoria virtual del sistema operativo para 'mapear' los archivos y presentarlos como amortiguadores programmaticly bytes. El sistema operativo administrará mover los bytes a/desde el disco y la memoria de forma automática y muy rápidamente.

Tendrá sentido crear dichos archivos para cada uno de sus archivos de registro para leerlos. Es importante que tengas 64 bits, ya que eso da a tus archivos un límite de TB en lugar de GB.

Navegar, filtrar y ordenar Sólo muestra los archivos de alguna jerarquía y el uso de una métrica como nombre de archivo o marca de tiempo para ordenarlos deben ser simples con su propio código cuando se está tratando con MBB. ¿Cuáles son sus criterios de filtro?

Buscar Ahora, si usted quiere buscar a través de ellos - Lucene se ejecuta en la parte superior de esto le daría un buen método para indexar los archivos. Hay varias maneras en que puede tomar esto también: use hadoop y Map/Reduce como otros lo han mencionado para distribuir tareas en varias máquinas.

Consejos de rendimiento en this sitio son geniales.

5

El formato de archivo HDF5 y la biblioteca relacionada están diseñados para almacenar grandes cantidades de datos y permitir E/S rápidas y eficientes.

El proyecto pytables proporciona una buena manera de utilizarlos desde python y proporciona métodos para ordenar y buscar.

2

Analizador de registros. Sugiero que mires el analizador de registro msft. Esto está incluido en el kit de recursos iis y proporciona mucho de lo que estás buscando. Quizás la característica más útil es la capacidad de hacer consultas tipo SQL en un archivo plano. Esto incluso se puede hacer a través de archivos.

1

Una opción puede ser Berkeley DB, o algún administrador similar de base de datos incrustable.

No he usado Berkely DB, pero de una mirada rápida, supongo que es similar a muchos administradores de bases de datos ISAM que existían hace años, básicamente una biblioteca para manejar claves en disco índice de datos estructuras de datos. La única advertencia: vi una mención de tablas hash, por lo que no puede hacer la parte secuencial de ISAM, pero espero que sí, la versión más reciente incluso tiene soporte SQL.

No es necesario necesariamente traducir el registro binario completo a un formato legible. Podría hacer un escaneo inicial de creación de índices que guarda las compensaciones en los archivos originales. Un índice útil podría ser simplemente desde el número de línea hasta el rango de bytes, por lo que puede mostrar un rango de línea específico rápidamente, aunque solo si los registros de registro son de longitud variable, por supuesto.

Si es algo así como Btrieve (que utilicé hace años por un tiempo), debería ser bastante fácil.

0

"sello de tiempo, tipo, mensaje, algunos GUID. Las entradas son homogéneas, sin relaciones, no es necesario almacenar los datos después de "inspeccionarlo".

¿Ha considerado simplemente almacenar las entradas discretas como archivos separados en un directorio?

Si solo tiene que hacer una clasificación simple, luego construya el nombre de archivo de los campos de clasificación y coloque los otros en el archivo. La selección es rápida si sabe qué campos desea.

Y lo mejor de todo es que la API está integrada en el sistema operativo.

..

Obviamente, si se necesita algo más flexible que eso, entonces usted va a necesitar una adecuada base de datos, pero puede funcionar dependiendo de sus requerimientos.

+0

En algunos casos serían más de 60 millones de archivos, supongo que eso sería un poco estresante para el FS. (?) – kurczak

Cuestiones relacionadas