方法

ArrowStreamDecoderget_next_required_size

自:18.0.0 起可用

声明 [源码]

gsize
garrow_stream_decoder_get_next_required_size (
  GArrowStreamDecoder* decoder
)

描述 [源码]

此方法提供给想要优化性能的用户。普通用户无需使用此方法。

以下是普通用户的示例用法

garrow_stream_decoder_consume_buffer(decoder, buffer1);
garrow_stream_decoder_consume_buffer(decoder, buffer2);
garrow_stream_decoder_consume_buffer(decoder, buffer3);

解码器具有内部缓冲区。如果已消耗的数据不足以推进解码器的状态,则已消耗的数据将被缓冲到内部缓冲区。这会导致性能开销。

如果将 `garrow_stream_decoer_get_next_required_size()` 返回的大小数据传递给每次 garrow_stream_decoder_consume_bytes()/garrow_stream_decoder_consume_buffer() 调用,则解码器不会使用其内部缓冲区。这将提高性能。

以下是避免使用内部缓冲区的示例用法

buffer1 = get_data(garrow_stream_decoder_get_next_required_size(decoder));
garrow_stream_decoder_consume_buffer(buffer1);
buffer2 = get_data(garrow_stream_decoder_get_next_required_size(decoder));
garrow_stream_decoder_consume_buffer(buffer2);

用户可以使用此方法来避免创建小块。记录批数据必须是连续数据。如果用户将小块传递给解码器,则解码器需要在内部连接小块。这会导致性能开销。

以下是减少小块的示例用法

GArrowResizablBuffer *buffer = garrow_resizable_buffer_new(1024, NULL);
while ((small_chunk = get_data(&small_chunk_size))) {
  size_t current_buffer_size = garrow_buffer_get_size(GARROW_BUFFER(buffer));
  garrow_resizable_buffer_resize(buffer, current_buffer_size + small_chunk_size,

NULL); garrow_mutable_buffer_set_data(GARROW_MUTABLE_BUFFER(buffer), current_buffer_size, small_chunk, small_chunk_size, NULL); if (garrow_buffer_get_size(GARROW_BUFFER(buffer)) < garrow_stream_decoder_get_next_required_size(decoder)) { continue; } garrow_stream_decoder_consume_buffer(decoder, GARROW_BUFFER(buffer), NULL); g_object_unref(buffer); buffer = garrow_resizable_buffer_new(1024, NULL); } if (garrow_buffer_get_size(GARROW_BUFFER(buffer)) > 0) { garrow_stream_decoder_consume_buffer(decoder, GARROW_BUFFER(buffer), NULL); } g_object_unref(buffer);

可用版本:自 18.0.0 起

返回值

类型: gsize

推进解码器状态所需的字节数。