Необычное использование RocksDB

То, как я хочу использовать RocksDB, кажется мне необычным. Я хочу использовать его, чтобы снизить нагрузку на память приложения, которое имеет очень большое количество строк в памяти. Причина в том, что приложение в конечном итоге масштабируется до такой степени, что в противном случае ему потребовались бы десятки гигабайт ОЗУ для хранения всех строк. Это только 64-битное приложение, часть которого написана на C++, а часть — на VB.NET (знаю, знаю).

Мне было поручено перенести все строки на диск.

Я хочу быть максимально результативным. Конечно, я могу использовать что-то вроде SQLite, но SQL мне вообще не нужен. Мне просто нужно хранилище ключей/значений. Ключ может быть 32-битным целым числом, а значением будет строка. Типичные строки имеют длину от 1K до 5K.

Требуемые эксплуатационные характеристики следующие:

  1. Строки записываются на диск массово. После написания они редко изменяются. В большинстве случаев они будут просто доступны только для чтения.
  2. Строки записываются на диск только как способ переместить их из оперативной памяти. Сохранение всех строк в ОЗУ одновременно для повышения производительности приведет к поражению человека. В идеале я могу указать, сколько оперативной памяти нужно использовать в качестве кеша.
  3. Прочность не важна. Меня не волнует, если кэш записи занимает много времени. На самом деле меня волнует только то, что строка записывается на диск только тогда, когда превышен размер буфера, указанный в (2) выше. Например, если у меня есть миллиард строк на диске и тысяча из них хранится в ОЗУ (как размер моего буфера), меня бы устраивало, что тысяча не записывается на диск до тех пор, пока тысяча и одна строка не будет выделено.

Почти каждая система, которую я рассматривал до этого момента, memcached, redis, leveldb, Lightning, LSM из sqlite 4, все решают разные проблемы. Некоторые решают проблему обеспечения долговечности вещей, поэтому многое делается для того, чтобы убедиться, что вещи защищены от сбоев. Очевидно, в моем случае меня не волнует, что все будет защищено от сбоев. Мое приложение воссоздает хранилище данных при запуске приложения. Если мое приложение выйдет из строя, мне все равно, что останется на диске. Третьи (такие как memecached) существуют для оптимизации производительности диска, сначала помещая вещи в ОЗУ. Это решение проблемы, которая почти противоположна той, которую мне нужно решить.

В конечном счете, и поскольку это 64-разрядная система, я бы хотел, чтобы система использовала файлы с отображением памяти для оптимизации.

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

Поэтому мне любопытно, готов ли кто-нибудь из команды RocksDB дать мне несколько советов. Если я смогу заставить это работать, я буду очень благодарен и, безусловно, помогу другим в Интернете решить такую ​​​​же проблему.


person Daisha Lynn    schedule 21.05.2016    source источник
comment
Я думаю, что простое использование RocksDB не может решить вашу проблему, вам нужна комбинация memcached и RocksDB, используя RocksDB в качестве «базы данных» и memcached в качестве «кеша».   -  person sel-fish    schedule 10.06.2016
comment
почему вы не используете файловую систему?   -  person amirouche    schedule 22.10.2019


Ответы (1)


Я не совсем понял ту часть, где вы говорите, что вам нужно переместить данные на диск, но мне не нужна устойчивость.

Помимо этого, leveldb был бы отличным выбором:

*fast writes
*ability to do atomic bulk insert (WriteBatch)
*low memory footprint
*fast key lookup (and fast iterator to read adjacent data)

Вы не указали платформу, но она встроена в Linux, или вы можете использовать порт Windows (обертки .net) в Windows.

person ren    schedule 10.06.2016
comment
Windows — это платформа. - person Daisha Lynn; 14.06.2016
comment
Долговечность гарантирует, что данные не будут потеряны в случае сбоя системы. Мне это не нужно, потому что это данные, которые в любом случае находятся в ОЗУ. Мне нужно поместить его в базу данных, чтобы сэкономить оперативную память, а не то, чтобы данные сохранялись при перезагрузке. - person Daisha Lynn; 14.06.2016