Дисковые классы контейнеров STL?

Мне нравится разрабатывать алгоритмы с использованием STL, однако у меня есть эта повторяющаяся проблема, когда мои наборы данных слишком велики для кучи.

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

Друг недавно указал мне на stxxl. Прежде чем я слишком увлекся этим ... Доступны ли какие-либо другие замены STL с дисковой поддержкой, которые мне следует рассмотреть?

ПРИМЕЧАНИЕ: меня не интересуют постоянные или встроенные базы данных. Пожалуйста, не упоминайте boost :: serialization, POST ++, библиотеку реляционных шаблонов, Berkeley DB, sqlite и т. д. Я знаю об этих проектах и ​​использую их, когда они подходят для моих целей.

ОБНОВЛЕНИЕ: несколько человек упомянули файлы отображения памяти и использование настраиваемого распределителя, хорошие предложения, кстати, но я бы указал им на обсуждение здесь, где Дэвид Абрахам предполагает, что для контейнеров с дисковой поддержкой потребуются специальные итераторы. Это означает, что подход настраиваемого распределителя вряд ли сработает.

Если ваши наборы данных слишком велики для кучи, вам следует подумать, правильна ли архитектура вашей системы (например, нужно ли переходить на 64-битную систему; сейчас это более распространено, чем когда был задан вопрос). Вы также должны подумать, является ли STL правильным подходом; он может делать предположения о размере набора данных, которые вам не подходят.

Donal Fellows 01.12.2010 09:15

@Donal Он может зарезервировать неправильный объем памяти.

the_drow 10.03.2011 01:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
40
2
5 938
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не очень разбираюсь в этом предмете, но возможно ли записать STL-подобный интерфейс в файл с отображением памяти?

edit: этот подход может быть подходящим, если вы пытаетесь получить доступ к определенной части огромного файла. Если вы пытаетесь что-то сделать со всем файлом, вы, вероятно, сгенерируете огромное количество ошибок страниц при чтении некэшированных частей файла.

Я подумал о том, чтобы сделать это ... но я бы не стал писать это сам, если что-то полезное уже было сделано.

paxos1977 29.09.2008 20:44

Я понимаю, что не хочу изобретать велосипед. Я не знаком с библиотекой, которая делает это; надеюсь, кто-то может порекомендовать один.

luke 29.09.2008 20:49

Я считаю, что Boost.Interprocess можно использовать для записи в файл с отображением памяти. Хотя на самом деле не пробовал.

Nemanja Trifunovic 29.09.2008 21:05

Если (когда вы пишете) вас не интересует постоянство, самым простым решением было бы увеличить размер кучи и использовать средства виртуальной памяти вашей операционной системы. Часть кучи, которая не умещается в физической памяти вашего компьютера, в конечном итоге будет выгружена на диск, что даст вам именно то, что вы хотите: обычный STL-доступ к данным, часто хранящимся на диске. Операционная система позаботится о кэшировании наиболее часто используемых страниц в физической памяти и удалении на диск тех, которые вы не используете часто. Ваш код останется прежним, и вы сможете повысить его производительность, просто добавив больше физической памяти.

Чтобы увеличить размер кучи, проверьте параметры вашей операционной системы, такие как ulimit (1) в системах Unix и Свойства системы - Дополнительно - Производительность - Дополнительно - Виртуальная память в Windows XP. Если вы достигли 32-разрядного предела в 4 ГБ, подумайте о переходе на 64-разрядную архитектуру или компиляции вашей программы для 64-разрядной версии.

Я опытный системный администратор, я рассмотрел предложенный вами подход. У меня есть машина amd64 под управлением unix. Я не могу позволить себе добавить больше физической памяти. Мое пространство подкачки составляет 2 ГБ, мой набор данных - 42 ГБ, мой жесткий диск - 1 ТБ ...

paxos1977 29.09.2008 20:51

Итак, как насчет увеличения пространства подкачки?

user3458 29.09.2008 21:50

Конечно, я подумал о том, чтобы перестроить свой сервер под этот проект. Однако это не специализированное оборудование, а машина, используемая для общих исследований. Помимо этого, в конечном итоге соавторам также потребуется запускать код, и я не думаю, что требование перестраивать свои машины сработает.

paxos1977 29.09.2008 22:02

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

См. Документацию об их простой в использовании реализации файлов с отображением памяти в boost :: interprocesses, в эта статья доктора Доббса для подробного обсуждения написания распределителей и в этот столбец программного обеспечения IEEE для описания проблемы и пример кода.

Я знаю статью DDJ, хорошая статья. Тем не менее, было обсуждение списка рассылки boost между Terpstra, Kuehl и Abraham, в котором предполагалось, что для работы со структурами данных на диске потребуются специальные итераторы ... что исключает подход настраиваемого распределителя.

paxos1977 29.09.2008 22:04
Ответ принят как подходящий

Я реализовал нечто очень похожее. Реализация итераторов является наиболее сложной задачей. Я использовал boost :: iterator_facade для реализации итераторов. Используя boost::iterator_facade, вы можете легко адаптироваться любой кэшированной на структуры данных на диске, чтобы иметь интерфейс контейнера STL.

Я использую Boost, но iterator_facade для меня в новинку. Мне нужно взглянуть на это, спасибо, что поделились.

paxos1977 30.09.2008 09:53

Хотите поделиться реализацией?

the_drow 10.03.2011 01:56

К сожалению, я не могу поделиться этим кодом. Однако, если у вас есть какие-либо вопросы, я буду более чем счастлив помочь.

Ted 16.03.2011 01:16

Другие вопросы по теме