У меня есть массив объектов (скажем, изображений), который слишком велик, чтобы поместиться в память (например, 40 ГБ). Но мой код должен иметь возможность произвольного доступа к этим объектам во время выполнения.
Каков наилучший способ сделать это?
С точки зрения моего кода, разумеется, не должно иметь значения, находятся ли некоторые данные на диске или временно хранятся в памяти; он должен иметь прозрачный доступ:
container.getObject(1242)->process();
container.getObject(479431)->process();
Но как мне реализовать этот контейнер? Должен ли он просто отправлять запросы в базу данных? Если так, какой из них будет лучшим вариантом? (Если база данных, то она должна быть бесплатной и не слишком хлопотной для администрирования, может быть, Berkeley DB или sqlite?)
Должен ли я сам это реализовать, запоминать объекты после того, как песок очищает память, когда она заполнена? Или для этого есть хорошие библиотеки (C ++)?
Требования к контейнеру должны заключаться в том, что он минимизирует доступ к диску (мой код может чаще обращаться к некоторым элементам, поэтому они должны храниться в памяти) и обеспечивает быстрый доступ.
ОБНОВЛЕНИЕ: Оказывается, STXXL не работает для моей проблемы, потому что объекты, которые я храню в контейнере, имеют динамический размер, т.е. мой код может обновлять их (увеличивая или уменьшая размер некоторых объектов) во время выполнения. Но STXXL не может справиться с этим:
STXXL контейнеры предполагают, что данные
Типы, которые они хранят, представляют собой простые старые данные
типы (POD).
http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html
Не могли бы вы прокомментировать другие решения? Как насчет использования базы данных? А какой?