CapnProto максимальный размер файла
На данный момент мы используем ProtocolBuffers для обмена данными между python и C++. Однако мы сталкиваемся с максимальным ограничением размера файловых буферов протокола и рассматриваем возможность переключения всего на Cap'n Proto. Однако, поскольку это в некоторой степени связано с буферами протокола, мне было интересно, есть ли у Cap'n Proto ограничение по максимальному размеру файла?
1 ответ
Максимальный размер файла Cap'n Proto составляет приблизительно 2^64 байта, или 16 exbibytes, что "должно быть достаточно для всех".:)
Cap'n Proto на самом деле является отличным форматом для чрезвычайно больших файлов данных, поскольку он поддерживает произвольный доступ и отложенную загрузку. При чтении огромного файла Cap'n Proto я рекомендую использовать mmap()
чтобы отобразить файл в память, а затем передать байты непосредственно реализации Cap'n Proto (например, capnp::FlatArrayMessageReader
в C++). Таким образом, операционная система помещает в память только те страницы файла, которые вы на самом деле используете. (В отличие от этого, для буферов протокола необходимо предварительно проанализировать весь файл в структуре данных в памяти, прежде чем вы сможете получить к нему доступ.)
Обратите внимание, что человек List
значение в структуре Cap'n Proto имеет предел 2^29-1 элементов. Text
а также Data
(строки и байтовые двоичные объекты) представляют собой особые виды списков, поэтому это означает, что размер любого отдельного смежного текста или байтового двоичного объекта ограничен 512 МБ. Однако таких блобов может быть несколько, поэтому большие данные можно сохранить в одном файле, разбив его на части.
Также обратите внимание, что большинство реализаций Cap'n Proto по умолчанию накладывают "предел обхода" при чтении структуры Cap'n Proto для защиты от вредоносных данных, содержащих циклы указателя. Как правило, по умолчанию это 64 МБ. Для больших данных вы захотите переопределить ограничение - в C++ вы захотите передать пользовательский ReaderOptions
к MessageReader
конструктор.