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