Pregunta

En nuestra aplicación usamos std::map Para almacenar datos (clave, valor) y usar la serialización para almacenar esos datos en el disco. Con este enfoque, estamos descubriendo que la E/S de disco es el cuello de botella de rendimiento y encontrar valores usando la tecla no es muy rápido.

Me he encontrado con LevelDB y pensando en usarlo. Pero tengo algunas preguntas.

  1. La documentación de LevelDB dice que está hecho para el par de valores de clave (String, String). ¿Significa que no puedo usar para pares de valores de clave personalizados?
  2. Parece la diferencia entre std::map y niveles de nivel es que LevelDB es persistente y std::map funciona en memoria. Entonces, significa que el cuello de botella de E/S de disco será más problemático para LevelDB.

Más específicamente, ¿alguien puede explicar si LevelDB podría ser una mejor opción que std::map?

PD: Intenté usar hash_maps pero parece ser más lento que std::map

¿Fue útil?

Solución

LevelDB solo hace algo más que std :: map.

¿De verdad estás diciendo que quieres (alto rendimiento) persistencia para std :: map?

  • Mire std :: map con un asignador personalizado. Asigne las entradas de una región mapeada de memoria y use FSYNC para garantizar que la información llegue al disco en momentos estratégicos en el tiempo.

  • Quizás combine eso con Eastl (que cuenta con un mapa std :: prospera con asignadores personalizados, de hecho no tienen un asignador predeterminado)

  • Mire el ajuste de su hash_map (std :: underded_map); Si hash_maps es más lento, debe investigar (a) loadFactor (b) hash de la función de hash

  • Por último, pero no menos importante: evalúe el uso de la serialización de impulso para la serialización binaria de su mapa (cualquier implementación que haya elegido). En mi experiencia, el rendimiento de la serialización de Boost es la parte superior del proyecto de ley.

Otros consejos

Lo que estás haciendo ahora es esto:

Digamos que tiene 1000000 registros en un archivo. Leíste el entero Archivo en std :: map, esto requiere alrededor de ~ 1000000 operaciones. Utiliza Buscar/Insertar para ubicar y/o insertar un elemento, esto lleva tiempo logarítmico (aproximadamente 20 comparaciones). Y ahora guarda el archivo completo nuevamente, transfiriendo todos estos registros de 1000000 nuevamente al archivo.

El problema es que no te beneficias absolutamente al usar std :: map. std :: map te ofrece tiempos de búsqueda rápidos (logarítmicos), pero inicializar y serializar todo el mapa por cada búsqueda anula sus beneficios.

Lo que necesita es rediseñar que se programa, por lo que cargará el mapa una vez al inicio y lo serialice una vez en la terminación. O, tal vez, si necesita la semántica de la base de datos, busque una implementación de la base de datos real. Sugiero usar SQLite, aunque LevelDB podría ser igual de bueno para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top