reducir los requisitos de memoria para la lista de adyacencia
-
20-09-2019 - |
Pregunta
Estoy usando adjacency_list
Desde mis gráficos son estáticos después de la carga y el borde y el recuento de vértices se sabe de antemano que veo un enorme potencial para la optimización. por ejemplo, me gustaría para asignar una única memoria intermedia para todos los vértices / bordes de un solo gráfico y dejar que la gráfica simplemente almacenar índices en ese búfer.
Más preguntas: Read
1) ¿cuál es la sobrecarga de la memoria de la utilización de propiedades de vértices y los bordes? yo
tener un buen número de ellos.
2) ¿Es posible para convencer al BGL utilizar el encogimiento para caber
¿idioma? Como lo entiendo las listas de adyacencia utilizan para agregar push_back
bordes. ¿Es posible reducir el uso de memoria mediante el canje de la
vector resultante con una copia de sí mismo? Tal vez copiando el conjunto
gráfica?
3) ¿Es posible utilizar los colocadores de la piscina impulso con la BGL? Tan lejos
que puedo decir el BGL realiza actualmente una gran cantidad de pequeñas asignaciones -
Realmente me gustaría evitar que por espacio de eficiencia y tiempo de ejecución razones.
¿Alguien ya construir una versión BGL optimizado para el uso de memoria? Debería tratar de usar las estructuras existentes y gráfico incrementarla con una asignadores personalizados o algo por el estilo o es más fructífera para escribir mi propia implementación y tratar de mantenerse interfaz compatible con el modo BGL Puedo seguir utilizando algoritmos es?
Saludos,
Sören
Solución
Hay un tipo de gráfico poco conocido llamado gráfico de "fila escaso comprimido" en el BGL. Parece que es bastante nuevo y no está vinculada a las páginas de índice. Sin embargo, sí emplea un hermoso pequeño truco para obtener la representación gráfica lo más pequeño posible. http://www.boost.org/doc/libs /1_40_0/libs/graph/doc/compressed_sparse_row.html
El uso de este para algunos de nuestros gráficos ya he sido capaz de reducir el uso total de memoria en un 20% - por lo que es una optimización que vale la pena en verdad
.También almacena las propiedades vértice / borde en vectores dando así la sobrecarga más pequeña posible para aquellos también.
Tenga en cuenta que la versión incluida con el último impulso 1.40 sólo es compatible con los gráficos de dirección (en contraposición a bidireccional). Si tiene que ser capaz de recorrer más eficiente fuera de los bordes de un Vértice y en los bordes (como yo) que necesita para comprobar el tronco impulso de la subversión. Jeremías fue muy útil para añadir esa característica en mi solicitud.
Otros consejos
-
La sobrecarga depende de la versión que está utilizando y si usted ha pasado por propiedades "paquetes" o no. Sólo he utilizado propiedades agrupadas ya la lectura del código que cabe esperar de cada manojo propiedad que cuesta 2 punteros + sizeof el tipo de paquete que está utilizando + sizeof cada una de las propiedades adjuntas. Ninguna de las cosas el concepto comprobación se deja en la que yo sepa binario. Ya que tienes el código, sin embargo, ¿por qué no medir el costo? Si usted no tiene ninguna herramientas para ayudar a tratar simplemente generando gráficos de tamaños conocidos en tampones de tamaños conocidos. Algo fallará finalmente y en ese punto se debe tener cuenta.
-
¿Ha intentado llamar
adjacency_list<blah>.swap(adjacency_list& x)
? Yo espero que se reduciría los contenedores adecuadamente. -
???
empecé a escribir algo parecido al sistema que está describiendo, pero finalmente di por vencido en el BGL y cambió a la codificación de mis propios algoritmos para ejecutarse en una base de datos SQLite de todos los símbolos de engarce.
Desde BGL está diseñado para interoperar con el legado o gráficos personalizados , probablemente mejor fuera de la escritura de su propio gráfico.
Como una respuesta a:
3) ¿Es posible utilizar los colocadores de la piscina impulso con la BGL? Por lo que yo puedo decir la BGL realiza actualmente una gran cantidad de pequeñas asignaciones -. Me gustaría evitar que por espacio de eficiencia y tiempo de ejecución razones
aquí :
template <class Allocator>
struct list_with_allocatorS { };
namespace boost {
template <class Alloc, class ValueType>
struct container_gen<list_with_allocatorS<Alloc>, ValueType>
{
typedef typename Alloc::template rebind<ValueType>::other Allocator;
typedef std::list<ValueType, Allocator> type;
};
}
// now you can define a graph using std::list
// and a specific allocator
typedef adjacency_list< list_with_allocatorS< std::allocator<int> >, vecS, directedS> MyGraph;