Споко, няма... а и не ми върши работа

Лошото е че и тия бози дето препоръчваш също не ми харесаха, в смисъл няма да ги ползвам. Но ти благодаря защото трябваше да се запозная с най-добрите преди да взема решение.
Няма да ги ползвам защото или са твърде големи за нуждите и нито една не е съобразена с условието на задачата. Последното е може би ключа към бараката ако се търси ефективност. Да вземем примерно реализация на едно дръвче. Ако имаш промяна на един ключ на практика трябва да се изчете сектора, да се копира в журнала и след това да се запише новата стойност. Минимум 2 писания на сектор и то ако сам си ги правиш, щото със стандартните файлови системи има поне още един служебен сектор в журнала. По-важното е, че при добавяне/изтриване не се променя само новия ключ ами и може и неговите родители до 9-то коляно докато се балансира дървото. С две думи според мен средно статистически при добавяне/изтриване на индекс се пишат поне 4-5 физически сектора.
Аз си мисля че мога да го сведа до средно 1.1-1.2 сектора

Накратко идеята е проЗт сортиран масив и малко още по-прозти идеи така че като вмъкваш да не се налага местене

Масивът е разположен в поредица от сектори и естествено в рамките на сектора ще има местене. В началото е един сектор, вмъкваш - променя се само тоя сектор. Въпросът е какво става като се напълни... Просто се разделя на две, едната половина остава в оригиналния сектор, другата половина формира нов сектор. При първия сектор е ясно, добавяме втори сектор и всичко е ОК.
За да се налага да местя сектори, нека да ги разделим на групи. Примерно от 256 сектора и нека имат логически номера, които съответстват на подредбата. И нека има една таблица от 256 байта, която казва кой логиски номер на кой физически съответства. Така ако да кажем вмъкна индекс в 2-ри логически сектор и той се напълни - шифтвам само таблицата с един байт надясно след 2-я и освобождавам място

Ако броят на секторите е по-малък от 256 с това се приключва. Иначе ще се наложи да изместя последния сектор към следващата група от сектори. Един вид така ще "балансирам" дървото си...
Нека да приемем най-тежката ситуация - да кажем голям ключ, примерно 12 байта +4 байта указател, т.е. в един сектор ще са 30-на индекса. Нека да се пише само един и същ ключ. Средно статистически на всеки 15 записа ще се налага да деля сектора на две. Тогава се пише по стария, по новия и по виртуалната таблица. Демек на 15 записа ще имам 14+3 промени по сектори (ако не броим журнала). И така докато се напълнят всичките 256 сектора.
Мисля си че преносът на сектори от група в група мога да ги избегна ако бозата е малка, или поне да го правя в свободното време, т.е. като станат 250 сектора и няма друга дейност последния ще го местя...
Сега, така или иначе секторите ми ще са с виртуални адрес, мисля да пооптимизирам и малко джурнала... Нормално журнала може да се направи с кръгов буфер, стига във всеки сектор да се отдели място за ревизията му. Тъй като ревизията постоянно расте, кръговия буфер е сортиран и съвсем лесно се стига до сектора с последна ревизия... Аз освен ревизия мисля да имам и CRC за да знам дали е валиден, както и битче да знам дали е последен в транзакция. Така при тръгване се търси последното писане в журнала, гледа се дали е ОК иначе се игнорира.
Та въпросът е как да се съчетае журнала с индексите. Ами просто трябва да се гарантира че има поне 2 празни сектора в групичката, естествено може и повече... Когато трябва да се промени някой сектор той се пише на мястото на празния, старото копие си остава. За да не се променя всеки път виртуалната таблица, корекциите мога да ги пиша в новия сектор ако има място. Нали секторите ми по принцип ще са наполовина празни

Тъй де, ще го обмисля още малко... но се надявам че промените ще могат да се правят много по-бързо, отколкото разните там дървета и хешове... А пък търсенето си е пак двоично търсене, ако не броим няколкото прочетени сектора в началото докато се получи таблицата, ама то при тръгване така или иначе се чеква журнала...