2013-11-19 3 views
2

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

Я ищу способ построить в C++ структуру данных для хранения различного количества объектов.

Ограничение таковы:

  1. Структура данных должна находиться на диске.
  2. Существует одна нить, записывающая структуру данных и многие другие, читающие ее.
  3. Каждое чтение является атомарным. (давайте предположим, что я могу атомарно читать блок размером 32/64 КБ для этого и что все объекты невелики, чем размер.
  4. Запись не должна блокировать чтение, поскольку можно предположить, что я могу писать в слитно блок 32/64KB, а также.
  5. замки не могут быть использованы на всех.

Любые предложения?

Я думал об использовании нечто вроде B-Tree и, когда необходимо разделять узлы и записывать новые данные, чем переносить их на новые узлы в конце файла, а затем просто обновлять указатели на узлы, которые будут находиться, например, в некоторых других файлах le (исходные блоки будут отмечены как свободные и добавлены к freestore)

Однако у меня возникает проблема, если файл сопоставления больше 32/64Kb. Скажем, я хочу, чтобы он удерживал даже 1 миллион указатели объектов, чем на 4 байта/указатель. Я получаю до 4 миллионов байт, что составляет примерно 4 мегабайта ... (и на 1 миллиард объектов даже больше, чем это). Это означает, что файл сопоставлений не может быть написан атомным образом.

Так что если у кого-то есть лучшее предложение относительно того, как, например, реализовать вышеизложенное, или даже в каком-то направлении, было бы весьма полезно.

Насколько я знаю, все открытые/коммерческие реализации B-Tree используют блокировки, которые я не могу использовать.

Спасибо, Макс.

+0

Но вам действительно нужно написать весь файл карты? Не будет ли достаточно обновить только тот блок, который изменился? –

+0

Я не вижу, как вы можете сделать это без блокировки ... – Johan

+3

Это невозможно в том, как вы описываете, поскольку API доступа к файлам ОС неявно имеет вид блокировки чтения-записи - т. Е. Вы в основном используете мьютексы OS вместо своих собственных. – DarkWanderer

ответ

3

Вы не получите очень далеко, просто считая, что чтение/запись является атомарным - в основном потому, что это не так, и вы в конечном итоге эмулируете его таким образом, чтобы убить производительность.

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

В то время как MVCC значительно более активен, чем структура блокировки CPU/RAM, после того, как вы используете, многие из тех же оптимистичных шаблонов блокировки применимы к ее использованию.

+0

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

+0

Ну, на самом деле MVCC не решает мою проблему, так как моя структура данных требует сортировки - следовательно, позволяет делать следующие/предыдущие операции над данными. MVCC решает проблему для таблицы хеширования, но она не обеспечивает сортировку. –

+0

MVCC не имеет ничего общего с вашей структурой данных, кроме как без блокировки. Он обычно используется с деревьями B + в базах данных, но может действительно использоваться для чего угодно. –

0

LMDB будет делать все это без проблем. Это дерево MVCC B +, и читатели полностью заблокированы.