То, как я хочу использовать RocksDB, кажется мне необычным. Я хочу использовать его, чтобы снизить нагрузку на память приложения, которое имеет очень большое количество строк в памяти. Причина в том, что приложение в конечном итоге масштабируется до такой степени, что в противном случае ему потребовались бы десятки гигабайт ОЗУ для хранения всех строк. Это только 64-битное приложение, часть которого написана на C++, а часть — на VB.NET (знаю, знаю).
Мне было поручено перенести все строки на диск.
Я хочу быть максимально результативным. Конечно, я могу использовать что-то вроде SQLite, но SQL мне вообще не нужен. Мне просто нужно хранилище ключей/значений. Ключ может быть 32-битным целым числом, а значением будет строка. Типичные строки имеют длину от 1K до 5K.
Требуемые эксплуатационные характеристики следующие:
- Строки записываются на диск массово. После написания они редко изменяются. В большинстве случаев они будут просто доступны только для чтения.
- Строки записываются на диск только как способ переместить их из оперативной памяти. Сохранение всех строк в ОЗУ одновременно для повышения производительности приведет к поражению человека. В идеале я могу указать, сколько оперативной памяти нужно использовать в качестве кеша.
- Прочность не важна. Меня не волнует, если кэш записи занимает много времени. На самом деле меня волнует только то, что строка записывается на диск только тогда, когда превышен размер буфера, указанный в (2) выше. Например, если у меня есть миллиард строк на диске и тысяча из них хранится в ОЗУ (как размер моего буфера), меня бы устраивало, что тысяча не записывается на диск до тех пор, пока тысяча и одна строка не будет выделено.
Почти каждая система, которую я рассматривал до этого момента, memcached, redis, leveldb, Lightning, LSM из sqlite 4, все решают разные проблемы. Некоторые решают проблему обеспечения долговечности вещей, поэтому многое делается для того, чтобы убедиться, что вещи защищены от сбоев. Очевидно, в моем случае меня не волнует, что все будет защищено от сбоев. Мое приложение воссоздает хранилище данных при запуске приложения. Если мое приложение выйдет из строя, мне все равно, что останется на диске. Третьи (такие как memecached) существуют для оптимизации производительности диска, сначала помещая вещи в ОЗУ. Это решение проблемы, которая почти противоположна той, которую мне нужно решить.
В конечном счете, и поскольку это 64-разрядная система, я бы хотел, чтобы система использовала файлы с отображением памяти для оптимизации.
RocksDB наиболее близок к инструменту, который мне нужно использовать, но это очень запутанная и сложная система с миллионом настроек. Кроме того, моего конкретного сценария нет ни в одном из опубликованных «рецептов».
Поэтому мне любопытно, готов ли кто-нибудь из команды RocksDB дать мне несколько советов. Если я смогу заставить это работать, я буду очень благодарен и, безусловно, помогу другим в Интернете решить такую же проблему.