dbms: unified hash tables: development [#METR-2944].

This commit is contained in:
Alexey Milovidov 2014-03-21 03:14:07 +04:00
parent 67ab83de9e
commit 850876f191
3 changed files with 2 additions and 97 deletions

View File

@ -76,6 +76,7 @@ struct HashTableCell
/// Установить значение ключа в ноль. /// Установить значение ключа в ноль.
void setZero() { key = 0; } void setZero() { key = 0; }
/// Установить отображаемое значение, если есть (для HashMap), в соответствующиее из value.
void setMapped(const value_type & value) {} void setMapped(const value_type & value) {}
/// Сериализация, в бинарном и текстовом виде. /// Сериализация, в бинарном и текстовом виде.

View File

@ -1,96 +0,0 @@
#pragma once
#include <malloc.h>
#include <string.h>
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
namespace DB
{
/** Общая часть разных хэш-таблиц, отвечающая за выделение/освобождение памяти.
* Используется в качестве параметра шаблона (есть несколько реализаций с таким же интерфейсом).
*/
class HashTableAllocator
{
public:
/// Выделить кусок памяти и заполнить его нулями.
void * alloc(size_t size)
{
void * buf = ::calloc(size, 1);
if (NULL == buf)
throwFromErrno("HashTableAllocator: Cannot calloc.", ErrorCodes::CANNOT_ALLOCATE_MEMORY);
return buf;
}
/// Освободить память.
void free(void * buf, size_t size)
{
::free(buf);
}
/** Увеличить размер куска памяти.
* Содержимое старого куска памяти переезжает в начало нового.
* Оставшаяся часть заполняется нулями.
* Положение куска памяти может измениться.
*/
void * realloc(void * buf, size_t old_size, size_t new_size)
{
buf = ::realloc(buf, new_size);
if (NULL == buf)
throwFromErrno("HashTableAllocator: Cannot realloc.", ErrorCodes::CANNOT_ALLOCATE_MEMORY);
memset(reinterpret_cast<char *>(buf) + old_size, 0, new_size - old_size);
return buf;
}
};
/** Аллокатор с оптимизацией для маленьких кусков памяти.
*/
template <size_t N = 64>
class HashTableAllocatorWithStackMemory : private HashTableAllocator
{
private:
char stack_memory[N]{};
public:
void * alloc(size_t size)
{
if (size <= N)
return stack_memory;
return HashTableAllocator::alloc(size);
}
void free(void * buf, size_t size)
{
if (size > N)
HashTableAllocator::free(buf, size);
}
void * realloc(void * buf, size_t old_size, size_t new_size)
{
if (new_size <= N)
return buf;
if (old_size > N)
return HashTableAllocator::realloc(buf, old_size, new_size);
buf = ::malloc(new_size);
if (NULL == buf)
throwFromErrno("HashTableAllocator: Cannot malloc.", ErrorCodes::CANNOT_ALLOCATE_MEMORY);
memcpy(buf, stack_memory, old_size);
memset(reinterpret_cast<char *>(buf) + old_size, 0, new_size - old_size);
return buf;
}
};
}

View File

@ -17,7 +17,7 @@
#include <DB/Core/Exception.h> #include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h> #include <DB/Core/ErrorCodes.h>
#include <DB/Common/HashTableAllocator.h> #include <DB/Common/HashTable/HashTableAllocator.h>
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES #ifdef DBMS_HASH_MAP_DEBUG_RESIZES
#include <iostream> #include <iostream>