Я широко использую adjacency_list‹ vecS, vecS, bidirectionalS ... >. У меня так много графиков загружено одновременно, что память становится проблемой. Я делаю статический анализ программы и сохраняю граф вызовов и графы потоков дизассемблированного двоичного файла в графах повышения. Таким образом, у меня может быть несколько десятков тысяч функций==графов потоков и один гигантский граф вызовов. Я действительно хотел бы уменьшить использование памяти для моих графиков, продолжая использовать BGL.
Поскольку мои графики статичны после загрузки, а количество ребер и вершин известно заранее, я вижу огромный потенциал для оптимизации. Например, я хотел бы выделить один буфер для всех вершин/ребер одного графа и позволить графу просто хранить индексы в этом буфере.
дополнительные вопросы:
1) каковы накладные расходы памяти при использовании свойств вершин и ребер? У меня их довольно много.
2) можно ли убедить BGL использовать сокращенную идиому? Насколько я понимаю, списки смежности используют push_back для добавления ребер. Можно ли уменьшить использование памяти, заменив результирующий вектор своей копией? Может быть, скопировав весь граф?
3) Можно ли использовать распределители пула повышения с BGL? Насколько я могу судить, BGL в настоящее время выполняет множество небольших распределений — мне бы очень хотелось избежать этого по соображениям экономии места и времени выполнения.
Кто-нибудь уже собрал версию BGL, оптимизированную для использования памяти? Должен ли я попытаться использовать существующие структуры графов и дополнить их пользовательскими распределителями или чем-то подобным, или более плодотворно написать свою собственную реализацию и попытаться сохранить интерфейс, совместимый с BGL, чтобы я мог продолжать использовать его алгоритмы?
наилучшие пожелания,
Sören