2012-06-17 21 views
9

Estoy almacenando una gran matriz binaria dentro de un documento. Deseo agregar continuamente bytes a esta matriz y, a veces, cambiar el valor de los bytes existentes.¿Cómo almacenar de manera eficiente y actualizar datos binarios en Mongodb?

Estaba buscando algunos tipos de modificadores $ append_bytes y $ replace_bytes, pero parece que lo mejor que puedo hacer es $ push para matrices. Parece que esto sería factible realizando operaciones de tipo búsqueda-escritura si tuviera acceso de algún modo al bson subyacente en el disco, pero no me parece que de todos modos haya que hacer esto en mongodb (y probablemente por una buena razón).

Si en cambio tuviera que consultar esta matriz binaria, editarla o agregarla, y luego actualizar el documento reescribiendo todo el campo, ¿qué tan costoso será esto? Cada matriz binaria será del orden de 1-2 MB y las actualizaciones se producen una vez cada 5 minutos y en miles de documentos. Peor aún, no existe una forma fácil de distribuirlos (en el tiempo) y, por lo general, estarán sucediéndose cerca unos de otros en intervalos de 5 minutos. ¿Alguien tiene una buena idea de lo desastroso que será esto? Parece que sería problemático.

Una alternativa sería almacenar estos datos binarios como archivos separados en el disco, implementar un grupo de subprocesos para manipular de manera eficiente los archivos en el disco y hacer referencia al nombre de archivo de mi documento mongodb. (Estoy usando python y pymongo, así que estaba mirando pytables). Preferiría evitar esto, si es posible.

¿Hay alguna otra alternativa que esté pasando por alto aquí?

Gracias en advnace.

EDITAR

Después de un trabajo escrito algunas pruebas para mis casos de uso que he decidido utilizar un sistema de archivos independiente para los objetos de datos binarios (HDF5 específicamente utilizando ya sea PyTables o h5py). Todavía usaré mongo para todo excepto la persistencia de estos objetos de datos binarios. De esta manera, puedo desacoplar el rendimiento relacionado con las operaciones de adición y actualización, lejos de mi rendimiento de mongo base.

Uno de los desarrolladores de mongo señaló que puedo establecer elementos de matriz interna usando notación de puntos y $ set (ver ref en el comentario a continuación), pero no hay manera de hacer un rango de conjuntos en una matriz atómicamente

Además, si tengo 1,000s de campos de datos binarios de 2MB dentro de mis documentos mongo y los estoy actualizando y ampliando a menudo (al menos una vez cada 5 minutos), mi instinto me dice que mongo tendrá que Administre una gran cantidad de problemas de asignación/crecimiento dentro de su (s) archivo (s) en el disco y, en última instancia, esto generará problemas de rendimiento. Preferiría descargar eso a un sistema de archivos separado en el nivel del SO para manejarlo.

Finalmente - Manipularé y realizaré cálculos en mis datos usando numpy - tanto los bloques de las tablas como h5py permiten una buena integración entre el comportamiento numpy y la tienda.

+0

Se acaba de traer a mi atención por uno de los desarrolladores mongodb que se puede acceder utilizando elementos de la matriz $ conjunto con la notación de punto. Pasé por alto esto. La referencia está en: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman

Respuesta

4

Como ha mencionado, con frecuencia está editando sus datos binarios, de hecho con mucha frecuencia. GridFS es otra opción que estaría sugiriendo.

When to use GridFS podría ser útil para usted

+1

Miré en GridFS ...Los archivos se ponen() en la colección y se encarga de distribuir automáticamente en fragmentos. También parece que si necesito cambiar algo, necesito volver a poner(), lo que ahorra otro conjunto completo de fragmentos. Parece estar construido para versionar archivos que no cambian con tanta frecuencia. Entonces, en mi caso, tendría una gran cantidad de copias del archivo. A menos que de alguna manera almacene los cambios por diff de alguna manera, pero ninguna de la documentación que vi sugirió ... – Rocketman

+0

Sí, en realidad actualizar los mandriles existentes sería un dolor de cabeza insoportable. En cambio, generalmente desea seguir este patrón: 1.) encuentre el antiguo, conserve el _id 2.) agregue uno nuevo 3.) elimine el antiguo por _id –

+0

http://stackoverflow.com/questions/6280186/append-data-to-existing-gridfs-file, eche un vistazo a este –

Cuestiones relacionadas