mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
Improve decompression in readbig to avoid unnecessary memcpy (#36095)
This commit is contained in:
parent
7a54a3c07b
commit
f4b275c4ac
@ -117,6 +117,25 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
|||||||
bytes_read += size_decompressed;
|
bytes_read += size_decompressed;
|
||||||
bytes += size_decompressed;
|
bytes += size_decompressed;
|
||||||
}
|
}
|
||||||
|
else if (nextimpl_working_buffer_offset > 0)
|
||||||
|
{
|
||||||
|
/// Need to skip some bytes in decompressed data (seek happened before readBig call).
|
||||||
|
size_compressed = new_size_compressed;
|
||||||
|
bytes += offset();
|
||||||
|
|
||||||
|
/// This is for clang static analyzer.
|
||||||
|
assert(size_decompressed + additional_size_at_the_end_of_buffer > 0);
|
||||||
|
memory.resize(size_decompressed + additional_size_at_the_end_of_buffer);
|
||||||
|
working_buffer = Buffer(memory.data(), &memory[size_decompressed]);
|
||||||
|
decompress(working_buffer, size_decompressed, size_compressed_without_checksum);
|
||||||
|
|
||||||
|
/// Read partial data from first block. Won't run here at second block.
|
||||||
|
/// Avoid to call nextImpl and unnecessary memcpy in read when the second block fits entirely to output buffer.
|
||||||
|
size_t size_partial = std::min((size_decompressed - nextimpl_working_buffer_offset),(n - bytes_read));
|
||||||
|
pos = working_buffer.begin() + nextimpl_working_buffer_offset;
|
||||||
|
nextimpl_working_buffer_offset = 0;
|
||||||
|
bytes_read += read(to + bytes_read, size_partial);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_compressed = new_size_compressed;
|
size_compressed = new_size_compressed;
|
||||||
@ -124,17 +143,12 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
|||||||
|
|
||||||
/// This is for clang static analyzer.
|
/// This is for clang static analyzer.
|
||||||
assert(size_decompressed + additional_size_at_the_end_of_buffer > 0);
|
assert(size_decompressed + additional_size_at_the_end_of_buffer > 0);
|
||||||
|
|
||||||
memory.resize(size_decompressed + additional_size_at_the_end_of_buffer);
|
memory.resize(size_decompressed + additional_size_at_the_end_of_buffer);
|
||||||
working_buffer = Buffer(memory.data(), &memory[size_decompressed]);
|
working_buffer = Buffer(memory.data(), &memory[size_decompressed]);
|
||||||
|
|
||||||
decompress(working_buffer, size_decompressed, size_compressed_without_checksum);
|
decompress(working_buffer, size_decompressed, size_compressed_without_checksum);
|
||||||
|
|
||||||
/// Manually take nextimpl_working_buffer_offset into account, because we don't use
|
///Read partial data from last block.
|
||||||
/// nextImpl in this method.
|
pos = working_buffer.begin();
|
||||||
pos = working_buffer.begin() + nextimpl_working_buffer_offset;
|
|
||||||
nextimpl_working_buffer_offset = 0;
|
|
||||||
|
|
||||||
bytes_read += read(to + bytes_read, n - bytes_read);
|
bytes_read += read(to + bytes_read, n - bytes_read);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user