Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

资源管理

VSAG 允许你掌控它所使用的内存与线程。本页介绍 Allocator(自定义内存管理)、 ThreadPool(自定义并发)、Resource(由 Engine 共享的两者打包)、进程级的 Options 单例,以及可插拔的 Logger

可运行示例:examples/cpp/201_custom_allocator.cpp202_custom_logger.cpp203_custom_thread_pool.cpp。另见 内存管理可扩展性

Allocator

声明于 vsag/allocator.h。用于自定义内存管理的抽象接口。实现它即可把索引的全部分配路由到你自己的池、 arena 或记账层,然后把它传给 Factory::CreateIndex 或一个 Resource

class Allocator {
public:
    virtual std::string Name() = 0;
    virtual void* Allocate(uint64_t size) = 0;
    virtual void Deallocate(void* p) = 0;
    virtual void* Reallocate(void* p, uint64_t size) = 0;

    template <typename T, typename... Args> T* New(Args&&... args);  // 分配 + 构造
    template <typename T> void Delete(T* p);                          // 析构 + 释放
};
成员说明
Name()allocator 实现的标识(用于诊断)。
Allocate(size)返回至少 size 字节的内存块。
Deallocate(p)释放先前由本 allocator 返回的内存块。
Reallocate(p, size)调整内存块大小,保留其内容。
New<T>(args...)辅助方法:分配并构造一个 T;若构造函数抛异常则释放并重新抛出。
Delete<T>(p)辅助方法:析构 *p 并释放其存储(对 null 安全)。

传给索引的 allocator 必须比该索引活得更久。VSAG 内置 allocator 可通过 Engine::CreateDefaultAllocator 获取。

ThreadPool

声明于 vsag/thread_pool.h。一个抽象的任务执行器。提供你自己的实现,即可让 VSAG 共享你应用的线程,而 不是自行创建。

class ThreadPool {
public:
    virtual void WaitUntilEmpty() = 0;
    virtual void SetQueueSizeLimit(std::uint64_t limit) = 0;
    virtual void SetPoolSize(std::uint64_t limit) = 0;
    virtual std::future<void> Enqueue(std::function<void(void)> task) = 0;
};
成员说明
WaitUntilEmpty()阻塞直到所有已入队任务完成。
SetQueueSizeLimit(limit)限制待处理任务队列;超过上限后的行为由实现定义。
SetPoolSize(limit)限制工作线程数量。
Enqueue(task)提交一个任务;返回用于其完成状态的 std::future<void>

现成的线程池可通过 Engine::CreateThreadPool 创建。

Resource

声明于 vsag/resource.hResource 把一个 Allocator 与一个 ThreadPool 打包,使一个 Engine —— 及其创建的每个索引 —— 都能共享它们。

class Resource {
public:
    explicit Resource(Allocator* allocator, ThreadPool* thread_pool);
    explicit Resource(const std::shared_ptr<Allocator>& allocator,
                      const std::shared_ptr<ThreadPool>& thread_pool);
    explicit Resource();  // 默认 allocator,无线程池

    std::shared_ptr<Allocator> GetAllocator() const;
    std::shared_ptr<ThreadPool> GetThreadPool() const;
};
构造函数 / 方法说明
Resource(Allocator*, ThreadPool*)使用你拥有的裸指针。allocator 为 null 表示“创建并拥有一个默认的”;线程池为 null 表示“无线程池”。
Resource(shared_ptr, shared_ptr)同上,采用共享所有权。
Resource()默认 allocator,无线程池。
GetAllocator()该资源的 allocator(若未提供则为默认的)。
GetThreadPool()该资源的线程池,若未提供则为 null。
auto alloc = vsag::Engine::CreateDefaultAllocator();
auto pool = vsag::Engine::CreateThreadPool(4).value();
vsag::Resource resource(alloc, pool);
vsag::Engine engine(&resource);
auto index = engine.CreateIndex("hgraph", params);

Options

声明于 vsag/options.h。用于全局配置的进程级单例,通过 Options::Instance() 访问。线程安全。OptionOptions 的类型别名。

vsag::Options::Instance().set_num_threads_building(8);
vsag::Options::Instance().set_logger(&my_logger);
配置项访问器默认值含义
IO 线程num_threads_io() / set_num_threads_io(n)8搜索期间磁盘索引 IO 的线程数(1–200)。
构建线程num_threads_building() / set_num_threads_building(n)4构建索引的线程数。
块大小上限block_size_limit() / set_block_size_limit(bytes)128 MB每个分配块的最大字节数(必须 > 2 MB)。
Direct-IO 对齐direct_IO_object_align_bit() / set_direct_IO_object_align_bit(bits)9Direct-IO 对象对齐,以位为单位(< 21)。
Loggerlogger() / set_logger(Logger*)nullptr当前 Logger;设置成功返回 true

Logger

声明于 vsag/logger.h。一个抽象的日志汇。实现它并通过 Options::set_logger 注册,即可把 VSAG 的日志 输出路由到你应用的日志系统。

内置 logger 默认使用 info。在内置 logger 创建前设置 VSAG_LOG_LEVEL,可选择 tracedebuginfowarn/warningerrorcriticaloff。无效值会被忽略,并保留默认等级。 显式调用 SetLevel 仍会覆盖从环境变量得到的等级。

启动 init banner

VSAG 会在 vsag::init() 运行时输出启动初始化 banner。如需隐藏该 banner, 请在进程启动前设置 VSAG_SUPPRESS_INIT_BANNER。这适用于测试、CI 任务, 或需要更安静启动日志的应用。

可识别的真值为 1ontrueontrue 按 ASCII 大小写不敏感匹配, 因此 ONOnTRUE 也有效。其他值会保留 banner 输出。

请务必在进程启动前设置该变量。VSAG 也会在静态初始化阶段运行 vsag::init(),因此在进程内部稍后再设置该变量,无法隐藏首次 banner。

banner 包含类似 48C503Ginstance spec 值,将 cpuinfo 获取的核心数与物理内存总量合并展示。 内存使用 1024^3 字节进行整 GiB 向下取整;如果平台查询失败,内存部分显示为 ?G。包括 neonsve 在内的 SIMD 行,仍保持原有的 distribution/platform/using 能力语义。

VSAG_SUPPRESS_INIT_BANNER=1 ./your_vsag_app
VSAG_SUPPRESS_INIT_BANNER=true ./your_vsag_test
class Logger {
public:
    enum Level : int {
        kTRACE = 0, kDEBUG = 1, kINFO = 2, kWARN = 3, kERR = 4, kCRITICAL = 5, kOFF = 6, kN_LEVELS
    };

    virtual void SetLevel(Level log_level) = 0;
    virtual void Trace(const std::string& msg) = 0;
    virtual void Debug(const std::string& msg) = 0;
    virtual void Info(const std::string& msg) = 0;
    virtual void Warn(const std::string& msg) = 0;
    virtual void Error(const std::string& msg) = 0;
    virtual void Critical(const std::string& msg) = 0;
};
成员说明
SetLevel(level)仅发出等级不低于 level 的消息。kOFF 关闭日志。
Trace / Debug / Info / Warn / Error / Critical以相应严重级别发出一条消息。

examples/cpp/202_custom_logger.cpp

参见