Контейнер произвольного доступа, который не умещается в памяти?

У меня есть массив объектов (скажите, изображения), который является слишком большим для вписывания в память (например, 40 ГБ). Но мой код должен смочь случайным образом получить доступ к этим объектам во времени выполнения.

Что лучший способ состоит в том, чтобы сделать это?

С точки зрения моего кода не должно иметь значения, конечно, если некоторые данные находятся на диске или временно сохранены в памяти; это должно иметь прозрачный доступ:

container.getObject(1242)->process();
container.getObject(479431)->process();

Но как я должен реализовать этот контейнер? Это должно просто отправить запросы к базе данных? Если так, какой был бы наилучшим вариантом? (Если база данных, то это должно быть свободно и не слишком много стычки администрирования, возможно, Беркли DB или sqlite?)

Я должен просто реализовать его сам, memoizing объекты после песка доступа, производящего чистку памяти, когда это полно? Или есть ли хорошие библиотеки (C++) для этого там?

Требования для контейнера были бы то, что он минимизирует доступ к диску (к некоторым элементам мог бы получать доступ более часто мой код, таким образом, они должны быть сохранены в памяти), и позволяет быстрый доступ.

ОБНОВЛЕНИЕ: Я оказываюсь, что STXXL не работает на мою проблему, потому что объекты, которые я храню в контейнере, имеют динамический размер, т.е. мой код может обновить их (увеличение или уменьшение размера некоторых объектов) во времени выполнения. Но STXXL не может обработать это:

Контейнеры STXXL предполагают, что типы данных, которые они хранят, являются простыми типами данных (POD). http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html

Вы могли прокомментировать другие решения? Что относительно того, чтобы использовать базу данных? И который?

6
задан Frank 26 January 2010 в 14:58
поделиться

5 ответов

считают Используя STXXL :

Ядро STXXL является реализацией из библиотеки стандартного шаблона C ++ STL для внешней памяти (вне ядра) вычисления, то есть, stxxl контейнеры и алгоритмы, которые могут обрабатывать огромные объемы данных, которые только подходит на диски. В то время как совместимость для STL поддерживает простоту использования и Совместимость с существующим Приложения, другой приоритет дизайна является высокой производительностью.

8
ответ дан 10 December 2019 в 00:38
поделиться

Я бы реализовал основной кэш. Благодаря этому размеру вы получите лучшие результаты с настроенным ассоциативным кэшем с помощью X Byte Cache-Lines (x == Что лучше всего соответствует вашему шаблону доступа). Просто реализуйте в программном обеспечении, что у каждого современного процессора уже есть аппаратное обеспечение. Это должно дать вам лучшие результаты. Вы можете больше оптимизировать его дальше, если вы сможете оптимизировать AccessPattern, чтобы быть как-то линейным.

1
ответ дан 10 December 2019 в 00:38
поделиться

Вы можете посмотреть в карты памяти, а затем получить доступ к одному из них.

1
ответ дан 10 December 2019 в 00:38
поделиться

Одним из растворов - использовать структуру, аналогичную B-дереву, индексам и «страницам» массивов или векторов. Концепция заключается в том, что индекс используется для определения того, какая страница загружается в память для доступа к вашей переменной.

Если вы делаете размер страницы меньше, вы можете хранить несколько страниц в памяти. Система кэширования на основе частоты использования или другого правила, уменьшит количество загрузочных нагрузок.

0
ответ дан 10 December 2019 в 00:38
поделиться

Я видел очень умный код, который перегружает оператор [] () для выполнения доступа к диску на лету и загрузки необходимых данных из диск / база данных прозрачно.

0
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: