python - sistemas - sistema de recomendacion tesis
¿Qué tienda de clave/valor es la más prometedora/estable? (15)
Estoy buscando comenzar a utilizar una tienda clave / valor para algunos proyectos paralelos (principalmente como una experiencia de aprendizaje), pero han aparecido tantos en el pasado reciente que no tengo idea de dónde comenzar. Recién lista de memoria, puedo pensar en:
- CouchDB
- MongoDB
- Riak
- Redis
- Gabinete de Tokio
- Berkeley DB
- Cassandra
- MemcacheDB
Y estoy seguro de que hay más por ahí que han escapado a través de mis esfuerzos de búsqueda. Con toda la información disponible, es difícil encontrar comparaciones sólidas entre todos los competidores. Mis criterios y preguntas son:
- (Más importante) ¿Cuál recomienda y por qué ?
- ¿Cuál es el más rápido?
- ¿Cuál es el más estable?
- ¿Cuál es el más fácil de configurar e instalar?
- ¿Cuáles tienen enlaces para Python y / o Ruby?
Editar:
Hasta ahora, parece que Redis es la mejor solución, pero eso es solo porque he obtenido una respuesta sólida (de ardsrk). Estoy buscando más respuestas como la suya, porque me apuntan hacia información útil y cuantitativa. ¿Qué tienda de Key-Value usas y por qué ?
Editar 2:
Si alguien tiene experiencia con CouchDB, Riak o MongoDB, me encantaría escuchar sus experiencias con ellos (y aún más si puede ofrecer un análisis comparativo de varios de ellos)
¿Cuál recomiendan y por qué?
Recomiendo a Redis. ¿Por qué? ¡¡Sigue leyendo!!
¿Cuál es el más rápido?
No puedo decir si es el más rápido. Pero Redis es fast . Es rápido porque contiene todos los datos en la RAM. Recientemente, se agregó la función de memoria virtual, pero aún así todas las claves permanecen en la memoria principal y solo se intercambian los valores que rara vez se usan en el disco.
¿Cuál es el más estable?
Nuevamente, dado que no tengo experiencia directa con las otras tiendas de valores-clave no puedo comparar. Sin embargo, Redis está siendo utilizado en producción por muchas aplicaciones web como GitHub e Instagram , entre muchas otras.
¿Cuál es el más fácil de configurar e instalar?
Redis es bastante fácil de instalar. Toma la source y en una caja de Linux ejecuta make install
. Esto produce redis-server
binary que podría ponerlo en su camino y comenzarlo.
redis-server
une al puerto 6379 de forma predeterminada. Eche un vistazo a redis.conf
que viene con la fuente para más opciones de configuración y configuración.
¿Cuáles tienen enlaces para Python y / o Ruby?
Redis tiene excelente soporte para Ruby y Python .
En respuesta al comentario de Xorlev a continuación: Memcached es simplemente una tienda de valores-clave simple. Redis admite tipos de datos complejos como listas, conjuntos y conjuntos ordenados y, al mismo tiempo, proporciona una interfaz simple para estos tipos de datos.
También hay make 32bit
que hace que todos los punteros solo make 32bit
tamaño de 32 bits incluso en máquinas de 64 bits. Esto ahorra una memoria considerable en máquinas con menos de 4 GB de RAM.
¿Qué tienda de valores clave es la más prometedora / estable?
La tienda G-WAN KV parece bastante prometedora :
DB engine Traversal
----------- ----------------------------
SQLite 0.261 ms (b-tree)
Tokyo-Cabinet (TC) 4.188 ms (hash table)
TC-FIXED 0.103 ms (fixed-size array)
G-WAN KV 0.010 ms (unamed)
Además, es utilizado internamente por el servidor web G-WAN, conocido por sus altas prestaciones de concurrencia (eso es para la pregunta de estabilidad ).
Como dijeron los demás, siempre depende de tus necesidades. Yo, por ejemplo, prefiero lo que mejor se adapte a mis aplicaciones.
Primero utilicé memcached para tener acceso rápido de lectura / escritura. Como API de Java he usado SpyMemcached, lo que viene con una interfaz muy fácil que puede usar para escribir y leer datos. Debido a fugas de memoria (no más memoria RAM) tuve que buscar otra solución, tampoco pude escalar correctamente, simplemente aumentar la memoria de un solo proceso no parecía ser un buen logro.
Después de algunas revisiones, vi couchbase, viene con replicación, clustering, auto-failover y una edición de comunidad (MS Windows, MacOs, Linux). Y lo mejor para mí fue que el cliente de Java implementa también SpyMemcached, así que no tuve casi nada más que hacer como configurar el servidor y usar couchbase en lugar de memcached como almacén de datos. ¿Ventaja? Claro, mis datos ahora son persistentes, replicados e indexados. Viene con una consola web para escribir funciones de reducción de mapas para vistas de documentos en erlang.
Tiene soporte para Python, Ruby, .Net y más, fácil configuración a través de la consola web y las herramientas del cliente. Se ejecuta estable. Con algunas pruebas, pude escribir aproximadamente 10k por segundo para registros de 200 a 400 bytes de longitud. Sin embargo, el rendimiento de lectura fue mucho más alto (ambos evaluados localmente). Diviértete tomando tu decisión.
Debe comprender de qué se trata el fenómeno NoSQL moderno.
No se trata de almacenes de valores clave. Han estado disponibles durante décadas (BerkeleyDB, por ejemplo). ¿Por qué todo el alboroto ahora?
No se trata de documentos elaborados o esquemas orientados a objetos y de superar el "desajuste de impedancia". Los defensores de estas características los han promocionado durante años y no llegaron a ninguna parte.
Se trata simplemente de abordar 3 problemas técnicos: failover automático, para desarrolladores y transparente (para desarrolladores de aplicaciones), fragmentación y replicación. Por lo tanto, debe ignorar los productos de moda que no ofrecen en este frente. Estos incluyen Redis, MongoDB, CouchDB, etc. Y concéntrese en soluciones verdaderamente distribuidas como cassandra, riak, etc.
De lo contrario, perderá todas las cosas buenas que sql le brinda (consultas adhoc, Crystal Reports para su jefe, herramientas de terceros y bibliotecas) y no obtendrá nada a cambio.
En PyCon de este año, Jeremy Edberg de Reddit dio una charla:
http://pycon.blip.tv/file/3257303/
Dijo que Reddit usa PostGres como una tienda clave-valor, presumiblemente con una simple tabla de dos columnas; según su charla, se había comparado más rápidamente que cualquier otra tienda de valores clave que habían probado. Y, por supuesto, es muy maduro.
En definitiva, OverClocked tiene razón; su caso de uso determina la mejor tienda. Pero los RDMBS han sido (ab) utilizados durante mucho tiempo como tiendas clave-valor, y también pueden ser muy rápidos.
He estado jugando con MongoDB y tiene una cosa que lo hace perfecto para mi aplicación, la capacidad de almacenar Mapas / Listas complejos en la base de datos directamente. Tengo un mapa grande donde cada valor es una lista y no tengo que hacer nada especial solo para escribir y recuperar eso sin conocer todas las claves y valores de la lista. No sé mucho sobre las otras opciones, pero la velocidad y esa capacidad hacen que Mongo sea perfecto para mi aplicación. Además, el controlador de Java es muy simple de usar.
Me gusta mucho memcached personalmente.
Lo uso en algunos de mis sitios y es simple, rápido y fácil. Realmente fue increíblemente fácil de usar, la API es fácil de usar. No almacena nada en el disco, de ahí el nombre memcached, por lo que queda fuera si está buscando un motor de almacenamiento persistente.
Python tiene python-memcached .
No he usado el cliente Ruby, pero una búsqueda rápida en Google revela RMemCache
Si solo necesitas un motor de almacenamiento en caché, Memcached es el camino a seguir. Está desarrollado, es estable y está sangrando rápido. Hay una razón por la que LiveJournal lo hizo y Facebook lo desarrolla. Está en uso en algunos de los sitios más grandes que existen con gran efecto. Se escala extremadamente bien.
Noto que todos confunden memcached con memcachedb. Son dos sistemas diferentes. El operador preguntó acerca de memcachedb.
memcached es almacenamiento de memoria. memcachedb utiliza Berkeley DB como su almacén de datos.
Solo para completar la lista: también hay Dreamcache. Es compatible con Memcached (en términos de protocolo, por lo que puede usar cualquier biblioteca cliente escrita para Memcached), es simplemente más rápido.
Solo tengo experiencia con Berkeley DB, así que mencionaré lo que me gusta de él.
- Es rápido
- Es muy maduro y estable
- Tiene una documentación sobresaliente
- Tiene enlaces C, C ++, Java & C # fuera de la caja. Otros enlaces de idiomas están disponibles. Creo que Python viene con enlaces como parte de sus "baterías".
El único inconveniente con el que me he encontrado es que los enlaces C # son nuevos y no parecen ser compatibles con todas las características.
Solo tiene experiencia con mongoDB, memchache y redis. Aquí hay una comparison entre ellos y couchDB.
Parece que mongoDB es el más popular. Admite sharding y replicación, finalmente consistente, tiene un buen soporte en ruby (mongoid). También tiene un conjunto de características más rico que los otros dos. Todo mongo, redis y memchache pueden almacenar la clave-valor en la memoria, pero redis parece ser mucho más rápido, de acuerdo con esta publicación , redis es 2x escritura, 3x lee más rápido que mongo. Tiene estructuras de datos mejor diseñadas y más ''peso liviano''.
Yo diría que tienen diferentes usos, mongoDB es probablemente bueno para el gran conjunto de datos y el almacenamiento de documentos, mientras que el memchache y redis son mejores para almacenar cachés o registros.
También hay zodb.
Todos ellos tienen diferentes características. Y no se olvide del Proyecto Voldemort que en realidad utiliza / prueba LinkedIn en su producción antes de cada lanzamiento.
Es difícil de comparar. Debe preguntarse qué necesita: por ejemplo, ¿quiere particionar? si es así, algunos de ellos, como CouchDB, no lo admitirán. ¿Quieres codificación borrado? Entonces la mayoría de ellos no tienen eso. Etc.
Berkeley DB es un motor de almacenamiento básico y de bajo nivel, que quizás pueda ser excusado de esta discusión. Varios sistemas clave-valor se construyen encima de él, para proporcionar características adicionales como replicación, control de versiones, codificación, etc.
Además, ¿qué necesita tu aplicación? Varias de las soluciones contienen complejidad que puede no ser necesaria. Por ejemplo, si solo almacena datos estáticos que no cambian, puede almacenarlos en el hash de contenido SHA-1 de los datos (es decir, usar el hash de contenido como clave). En este caso, no tiene que preocuparse por la frescura, la sincronización, el control de versiones y se pueden eliminar muchas complejidades.
Una distinción que tiene que hacer es ¿para qué usará la base de datos? No saltes a bordo solo porque está de moda. ¿Necesitas una tienda de valores clave? o necesitas una tienda basada en documentos? ¿Cuál es su requisito de huella de memoria? ejecutarlo en una pequeña máquina virtual o una máquina separada?
Recomiendo enumerar primero sus requisitos y luego ver cuáles se superponen con sus requisitos.
Dicho esto, he usado CouchDB / MongoDB y prefiero usar MongoDB por su facilidad de configuración y la mejor transición desde las consultas de estilo de mysql. Elegí mongodb sobre sql debido a esquemas dinámicos (¡sin archivos de migración!) Y mejor modelado de datos (matrices, hashes). No evalué según la escalabilidad.
MongoMapper es un gran mapeador de orbitales MongoDB para Ruby y ya hay un tenedor Rails 3 en funcionamiento.
Enumeré algunos detalles más sobre por qué preferí mongodb en mis diapositivas de scribd http://tommy.chheng.com/index.php/2010/02/mongodb-for-natural-development/
Cassandra parece ser popular.
Cassandra está en uso en Digg, Facebook, Twitter, Reddit, Rackspace, Cloudkick, Cisco, SimpleGeo, Ooyala, OpenX y más compañías que tienen conjuntos de datos grandes y activos. El clúster de producción más grande tiene más de 100 TB de datos en más de 150 máquinas.