mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-02 20:42:04 +00:00
stash
This commit is contained in:
parent
41ba0118b5
commit
f6ef78c0f1
@ -228,11 +228,22 @@ void insertSetMapped(MappedType & dest, const ValueType & src) { dest = src.seco
|
|||||||
/** Determines the size of the hash table, and when and how much it should be resized.
|
/** Determines the size of the hash table, and when and how much it should be resized.
|
||||||
*/
|
*/
|
||||||
template <size_t initial_size_degree = 8>
|
template <size_t initial_size_degree = 8>
|
||||||
struct HashTableGrower
|
class HashTableGrower
|
||||||
{
|
{
|
||||||
/// The state of this structure is enough to get the buffer size of the hash table.
|
/// The state of this structure is enough to get the buffer size of the hash table.
|
||||||
|
|
||||||
UInt8 size_degree = initial_size_degree;
|
UInt8 size_degree = initial_size_degree;
|
||||||
|
size_t cached_mask = (1ULL << initial_size_degree) - 1;
|
||||||
|
size_t cached_max_fill = 1ULL << (initial_size_degree - 1);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void updateSizeDegree()
|
||||||
|
{
|
||||||
|
cached_mask = (1ULL << size_degree) - 1;
|
||||||
|
cached_max_fill = 1ULL << (size_degree - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
static constexpr auto initial_count = 1ULL << initial_size_degree;
|
static constexpr auto initial_count = 1ULL << initial_size_degree;
|
||||||
|
|
||||||
/// If collision resolution chains are contiguous, we can implement erase operation by moving the elements.
|
/// If collision resolution chains are contiguous, we can implement erase operation by moving the elements.
|
||||||
@ -241,8 +252,8 @@ struct HashTableGrower
|
|||||||
/// The size of the hash table in the cells.
|
/// The size of the hash table in the cells.
|
||||||
size_t bufSize() const { return 1ULL << size_degree; }
|
size_t bufSize() const { return 1ULL << size_degree; }
|
||||||
|
|
||||||
size_t maxFill() const { return 1ULL << (size_degree - 1); }
|
size_t maxFill() const { return cached_max_fill; }
|
||||||
size_t mask() const { return bufSize() - 1; }
|
size_t mask() const { return cached_mask; }
|
||||||
|
|
||||||
/// From the hash value, get the cell number in the hash table.
|
/// From the hash value, get the cell number in the hash table.
|
||||||
size_t place(size_t x) const { return x & mask(); }
|
size_t place(size_t x) const { return x & mask(); }
|
||||||
@ -257,6 +268,7 @@ struct HashTableGrower
|
|||||||
void increaseSize()
|
void increaseSize()
|
||||||
{
|
{
|
||||||
size_degree += size_degree >= 23 ? 1 : 2;
|
size_degree += size_degree >= 23 ? 1 : 2;
|
||||||
|
updateMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the buffer size by the number of elements in the hash table. Used when deserializing a hash table.
|
/// Set the buffer size by the number of elements in the hash table. Used when deserializing a hash table.
|
||||||
@ -267,11 +279,13 @@ struct HashTableGrower
|
|||||||
: ((initial_size_degree > static_cast<size_t>(log2(num_elems - 1)) + 2)
|
: ((initial_size_degree > static_cast<size_t>(log2(num_elems - 1)) + 2)
|
||||||
? initial_size_degree
|
? initial_size_degree
|
||||||
: (static_cast<size_t>(log2(num_elems - 1)) + 2));
|
: (static_cast<size_t>(log2(num_elems - 1)) + 2));
|
||||||
|
updateMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBufSize(size_t buf_size_)
|
void setBufSize(size_t buf_size_)
|
||||||
{
|
{
|
||||||
size_degree = static_cast<size_t>(log2(buf_size_ - 1) + 1);
|
size_degree = static_cast<size_t>(log2(buf_size_ - 1) + 1);
|
||||||
|
updateMask();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -153,7 +153,11 @@ template <size_t initial_size_degree = 8>
|
|||||||
struct StringHashTableGrower : public HashTableGrower<initial_size_degree>
|
struct StringHashTableGrower : public HashTableGrower<initial_size_degree>
|
||||||
{
|
{
|
||||||
// Smooth growing for string maps
|
// Smooth growing for string maps
|
||||||
void increaseSize() { this->size_degree += 1; }
|
void increaseSize()
|
||||||
|
{
|
||||||
|
this->size_degree += 1;
|
||||||
|
HashTableGrower<initial_size_degree>::updateMask();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Mapped>
|
template <typename Mapped>
|
||||||
|
@ -21,6 +21,7 @@ struct TwoLevelHashTableGrower : public HashTableGrower<initial_size_degree>
|
|||||||
void increaseSize()
|
void increaseSize()
|
||||||
{
|
{
|
||||||
this->size_degree += this->size_degree >= 15 ? 1 : 2;
|
this->size_degree += this->size_degree >= 15 ? 1 : 2;
|
||||||
|
HashTableGrower<initial_size_degree>::updateMask();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user