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