Я только начал работать над сборщиком данных на основе хаупа для открытых данных карты улиц. Есть несколько форматов, но я ориентировался на формат, основанный на протокольном буфере (обратите внимание, это не чистый pb).
Мне кажется, что было бы более эффективно предварительно разделить файл на файл последовательности - в отличие от обработки кодирования переменной длины в пользовательском формате чтения/входа - но хотелось бы проверить работоспособность.
Этот формат более подробно описан в Описании формата PBF. Но в основном это коллекция [BlobHeader,Blob ] блоки.
Есть заголовок большого двоичного объекта
message BlobHeader {
required string type = 1;
optional bytes indexdata = 2;
required int32 datasize = 3;
}
А затем Blob (размер которого определяется параметром datasize в заголовке)
message Blob {
optional bytes raw = 1; // No compression
optional int32 raw_size = 2; // Only set when compressed, to the uncompressed size
optional bytes zlib_data = 3;
// optional bytes lzma_data = 4; // PROPOSED.
// optional bytes OBSOLETE_bzip2_data = 5; // Deprecated.
}
Очевидно, что когда вы попадаете в блоб, становится больше структуры, но я бы справился с этим в сопоставителе - то, что я хотел бы сделать, это изначально иметь по одному блобу на сопоставитель (позже может быть несколько BLOB-объектов на сопоставитель).
Некоторые из других форматов ввода/считывателей записей используют «достаточно большой» размер разделения, а затем выполняют поиск вперед/назад к разделителю, но, поскольку нет разделителя, который позволил бы мне узнать смещение больших двоичных объектов/заголовков, и нет индекса, который также указывает на них - я не вижу никакого способа получить свои точки разделения без предварительной потоковой передачи через файл.
Теперь мне не нужно было бы фактически читать весь файл с дисков — я мог бы начать с чтения заголовка, используя эту информацию для поиска за пределами блоба, установить его как первую точку разделения, а затем повторить. Но это единственная альтернатива предварительному разделению на файл последовательности, которую я могу придумать.
Есть ли лучший способ справиться с этим - или, если нет, мысли по поводу двух предложений?