library c database performance cross-platform

library - Qué base de datos integrada capaz de 100 millones de registros tiene una API C o C++ eficiente



c++ libraries (11)

No mencionó en qué plataforma está, pero si Windows solo está bien, eche un vistazo al Motor de almacenamiento extensible (anteriormente conocido como Jet Blue), el motor de tablas ISAM incorporado incluido en Windows 2000 y posterior. Se usa para Active Directory, Exchange y otros componentes internos, optimizados para un pequeño número de tablas grandes.

Tiene una interfaz C y admite tipos de datos binarios de forma nativa . Admite índices , transacciones y utiliza un registro para garantizar la atomicidad y la durabilidad. No hay lenguaje de consulta; usted tiene que trabajar con las tablas y los índices directamente usted mismo.

A ESE no le gusta abrir archivos a través de una red, y no admite compartir una base de datos a través del intercambio de archivos. Será muy difícil encontrar un motor de base de datos que permita compartir archivos compartidos. El motor de base de datos Access Jet (también conocido como Jet Red, base de códigos totalmente separada) es el único que conozco, y es notorio por corromper archivos en la red, especialmente si son grandes (> 100 MB).

Independientemente del motor que utilice, lo más probable es que deba implementar las funciones de uso compartido en su propio proceso de servidor de red o utilizar un motor de base de datos discreto.

Estoy buscando un motor de base de datos multiplataforma que pueda manejar bases de datos de hasta cientos de millones de registros sin una degradación grave en el rendimiento de las consultas. Necesita tener una API C o C ++ que permita la construcción fácil y rápida de los registros y el análisis de los datos devueltos.

Muy desalentados son los productos donde los datos deben ser traducidos desde y hacia cadenas solo para ingresar a la base de datos. Los usuarios técnicos que almacenan cosas como direcciones IP no quieren ni necesitan esta sobrecarga. Este es un criterio muy importante, así que si va a referirse a productos, explíquese cómo ofrecen una API tan directa. No deseo ser grosero, pero puedo usar Google; supongamos que he encontrado la mayoría de los productos principales y lo estoy preguntando porque a menudo es difícil determinar qué API directa ofrecen, en lugar de solo un contenedor C sobre SQL.

No es necesario que sea un RDBMS; bastaría con un enfoque simple basado en registros ISAM.

Si bien la principal necesidad es una base de datos de usuario único, la expansión a algún tipo de archivo compartido o las operaciones del servidor es probable para su uso futuro.

El acceso al código fuente, ya sea de código abierto o mediante licencia, es muy conveniente si la base de datos proviene de una empresa pequeña. No debe ser GPL o LGPL.


SQLite cumpliría esos criterios, excepto en el caso del futuro escenario de archivos compartidos en el futuro (y en realidad podría hacer eso si el sistema de archivos de red implementa bloqueos de archivos correctamente).


SQLite tiende a ser la primera opción. No almacena los datos como cadenas pero creo que tienes que construir un comando SQL para hacer la inserción y ese comando tendrá algo de construcción de cadenas.

BerkeleyDB es un producto bien diseñado si no necesita una relación DB. No tengo idea de lo que Oracle le cobra y si necesita una licencia para su aplicación.

Personalmente, consideraría por qué tiene algunos de sus requisitos. ¿Ha hecho pruebas para verificar el requisito de que necesita hacer una inserción directa en la base de datos? Parece que puede tomar un par de horas escribir un contenedor que convierte desde cualquier API que desee a SQL y luego ver si SQLite, MySql ... cumple con sus requisitos de velocidad.


Se han mencionado muchas buenas soluciones (como SQLite). Permítanme agregar dos, ya que no requieren SQL:

  • HamsterDB rápido, fácil de usar, puede almacenar datos binarios arbitrarios. No hay disposiciones para bases de datos compartidas.
  • El módulo Glib HashTable también parece bastante interesante y es muy común, por lo que no correrás el riesgo de entrar en un callejón sin salida. Por otro lado, no estoy seguro de que haya una manera fácil de almacenar la base de datos en el disco, es principalmente para cosas en la memoria

He probado ambos en proyectos de varios millones de registros.


Una opción podría ser Firebird . Ofrece tanto un producto basado en servidor como un producto integrado.

También es de código abierto y hay una gran cantidad de proveedores para todo tipo de idiomas.


podrías considerar C-Tree por FairCom - diles que te envié ;-)


Creo que lo que estás buscando es BerkeleyDB: http://www.oracle.com/technology/products/berkeley-db/db/index.html

No importa que sea Oracle, la licencia es gratuita y es de código abierto; la única pega es que si redistribuye su software que usa BerkeleyDB, también debe hacer que su fuente esté disponible, o comprar una licencia.

No proporciona soporte SQL, sino búsquedas directas (a través de la estructura b-tree o hash-table, lo que tenga más sentido para sus necesidades). Es extremadamente confiable, rápido, ACID, tiene soporte de replicación incorporado, y más.

Aquí hay una pequeña cita de la página a la que me refiero arriba, que enumera algunas características:

Almacenamiento de datos

Berkeley DB almacena datos de forma rápida y sencilla sin la sobrecarga encontrada en otras bases de datos. Berkeley DB es una biblioteca C que se ejecuta en el mismo proceso que su aplicación, evitando los retrasos en la comunicación entre procesos al usar un servidor de base de datos remota. Las memorias caché compartidas mantienen la información más activa en la memoria, evitando el costoso acceso al disco.

  • Almacenamiento de datos local en proceso
  • Esquema neutral, formato de datos nativos de la aplicación
  • Recuperación indexada y secuencial (Btree, Queue, Recno, Hash)
  • Múltiples procesos por aplicación y múltiples hilos por proceso
  • Bloqueo de grano fino y configurable para sistemas altamente concurrentes
  • Control de concurrencia de múltiples versiones (MVCC)
  • Soporte para índices secundarios
  • En memoria, en disco o en ambos
  • Compactación Btree en línea
  • Recuperación de espacio en disco Btree en línea
  • Eliminación en línea de bloqueo abandonado
  • En cifrado de datos en disco (AES)
  • Graba hasta 4GB y tablas de hasta 256TB

Actualización: Acabo de encontrar este proyecto y pensé en la pregunta que publicaste: http://tokyocabinet.sourceforge.net/index.html . Está bajo LGPL, por lo que no es compatible con tus restricciones, pero es un proyecto interesante para verificar, no obstante.


Como está familiarizado con Fairtree, entonces probablemente también esté familiarizado con Raima RDM.

Fue fuente abierta hace unos años, luego dbstar afirmó que de alguna manera habían adquirido los derechos de autor. Esto parece discutible sin embargo. Al leer la licencia original de Raima, esto no parece posible. Por supuesto, es posible quedarse con el lanzamiento del código original. Es bastante raro, pero tengo una copia archivada.


Solía ​​haber un producto llamado b-trieve, pero no estoy seguro de si se incluyó el código fuente. Creo que ha sido descontinuado. El único motor de base de datos que conozco con una orientación ISAM es c-tree.


soy el autor de hamsterdb.

tokyo cabinet y berkeleydb deberían funcionar bien. hamsterdb definitivamente funcionará. Es una API C sencilla, de código abierto, independiente de la plataforma, muy rápida y probada con bases de datos de hasta varios cientos de GB y cientos de millones de elementos.

Si está dispuesto a evaluar y necesita ayuda, envíeme un correo (formulario de contacto en hamsterdb.com) - ¡lo ayudaré lo mejor posible!

adiós Christoph


Para cualquiera que encuentre esta página unos años más tarde, ahora estoy usando LevelDB con algunos andamios en la parte superior para agregar la indexación múltiple necesaria. En particular, es una buena opción para bases de datos integradas en iOS. ¡Terminé escribiendo un libro sobre eso! (Comenzando con LevelDB, de Packt a finales de 2013).