Читайте значение в rocksdb кусками - PullRequest
0 голосов
/ 01 марта 2020

Я хочу прочитать действительно огромное значение, хранящееся в породе. Можно ли прочитать его по частям? Как чтение содержимого файла в фиксированный буфер ...

например, у меня есть значение 500 МБ, то есть файл, сжатый zlib. так как это серверная программа, я не могу выделить 500 МБ для каждого соединения (500 МБ для значения, которое может быть больше в любом случае, а также контекст SSL, информация для аутентификации и т. д. c ...).

А также, эти значения имеют значение для протокола, поэтому я не могу его разделить. Согласно документации, размер значения должен быть меньше 3 ГБ. Я не думаю, что какая-либо серверная программа выделяет этот размер для одного соединения.

Я могу привести несколько примеров, которые могут быть полезны:

  1. создание файловой системы поверх RocksDB
  2. Хранение звуков, изображений, видео, ... в приложении обмена сообщениями

Допустим, такой пример:

Slice partialSlice;
db->Get(opt,"ac154df568bb874", &partialSlice, 256*1024);  /// read 256KB at once
socket.write(partialSlice.data(), 256*1024);
while(partialSlice.HaveRemaining) {
   /// repate it to get all of data...
}

1 Ответ

1 голос
/ 01 марта 2020

Проверка PinnableSlice . Похоже, что это хорошее решение для этого сценария.

Просто получите кусок значения, обработайте его кусками (без дополнительной памяти; обратитесь к разделу об ограничениях), и все готово. Возможно, у вас уже есть функция, которая принимает необработанную память для распаковки, чтобы избежать перерасхода памяти для входных данных.


Альтернативное решение может быть:

Сохранить путь / дескриптор Сжатие файла с ключом, извлечение его при необходимости и обработка. Задержка здесь должна быть измерена в случае дискового ввода-вывода файла и версии в памяти из БД.

...