Замена STL на основе диска для С++

Недавно я создал приложение, которое в значительной степени опирается на очереди stl и сталкивается с проблемами памяти, очередь становится большой, чтобы вписаться в память машин. Существуют ли резервные копии с открытым исходным кодом, эффективные очереди ввода-вывода IO/памяти, которые могут быть подключены к месту очереди stl, что делает мое приложение волшебным образом использовать меньше оперативной памяти?

Мне бы хотелось что-то с буфером-механизмом чтения/записи, так как мое приложение составляет около 50k enqueues/dequeues pr sec, а объекты довольно малы.

Моя очередь содержит пары из 32-битных целых чисел, что делает каждую запись 64-разрядной, связанные списки не могут быть исключены из-за того, что они удвоят потребление памяти.

Ответ 1

Я бы рассмотрел использование STXXL. Он повторно реализует многие интерфейсы контейнеров stl с файловой системой. Одна из этих реализаций предназначена для структуры deque.

Ответ 2

Да, попробуйте STXXL. Но не используйте deque, если вы можете избежать произвольного доступа (т.е. Оператора []). Вместо этого используйте stxxl:: sequence, он эффективен во внешней памяти.

Отказ от ответственности: я возрождаю библиотеку. Пожалуйста, пришлите мне патч, если вы исправите проблему С++ 11, которая, вероятно, связана с программной цепочкой MacOSX.

Ответ 3

std::queue - это адаптер контейнера, означающий, что это, по существу, интерфейс над другим контейнером. В этом случае по умолчанию используется std::deque, который представлен в памяти как вектор массивов с постоянным размером, так как вектор содержит указатели на массивы, которые он хорошо вписывает в память. Если вам нужно, чтобы вещи были еще менее смежными, вы могли бы попытаться сделать бэкэнд std::list, связанные структуры могут часто обрабатывать очень большие объемы данных, так как они не должны быть смежными.

Вы также можете предоставить свой собственный интерфейс интерфейсу, он должен соответствовать требованиям SequenceContainer