У меня есть интересная задача для тех, у кого сильный фон в структурах без блокировки и на структурах данных на основе дисков.Внедрение структуры данных без блокировки на диске
Я ищу способ построить в C++ структуру данных для хранения различного количества объектов.
Ограничение таковы:
- Структура данных должна находиться на диске.
- Существует одна нить, записывающая структуру данных и многие другие, читающие ее.
- Каждое чтение является атомарным. (давайте предположим, что я могу атомарно читать блок размером 32/64 КБ для этого и что все объекты невелики, чем размер.
- Запись не должна блокировать чтение, поскольку можно предположить, что я могу писать в слитно блок 32/64KB, а также.
- замки не могут быть использованы на всех.
Любые предложения?
Я думал об использовании нечто вроде B-Tree и, когда необходимо разделять узлы и записывать новые данные, чем переносить их на новые узлы в конце файла, а затем просто обновлять указатели на узлы, которые будут находиться, например, в некоторых других файлах le (исходные блоки будут отмечены как свободные и добавлены к freestore)
Однако у меня возникает проблема, если файл сопоставления больше 32/64Kb. Скажем, я хочу, чтобы он удерживал даже 1 миллион указатели объектов, чем на 4 байта/указатель. Я получаю до 4 миллионов байт, что составляет примерно 4 мегабайта ... (и на 1 миллиард объектов даже больше, чем это). Это означает, что файл сопоставлений не может быть написан атомным образом.
Так что если у кого-то есть лучшее предложение относительно того, как, например, реализовать вышеизложенное, или даже в каком-то направлении, было бы весьма полезно.
Насколько я знаю, все открытые/коммерческие реализации B-Tree используют блокировки, которые я не могу использовать.
Спасибо, Макс.
Но вам действительно нужно написать весь файл карты? Не будет ли достаточно обновить только тот блок, который изменился? –
Я не вижу, как вы можете сделать это без блокировки ... – Johan
Это невозможно в том, как вы описываете, поскольку API доступа к файлам ОС неявно имеет вид блокировки чтения-записи - т. Е. Вы в основном используете мьютексы OS вместо своих собственных. – DarkWanderer