FEATURED · 精选文章

如何在 Rust、Julia 等语言程序中使用 Faiss C API?

发布时间 / 2026/9/10 7:36:27
来源 / 创域科博编辑部
栏目 / 资讯中心
如何在 Rust、Julia 等语言程序中使用 Faiss C API? 如何在 Rust、Julia 等语言程序中使用 Faiss C API【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faissFaiss 的 Python 接口依赖 SWIG 生成而 Rust、Julia 等语言没有 SWIG 支持无法直接使用。为此 Faiss 提供了一套纯 C 接口C API可以用在纯 C 程序中也可以作为 Foreign Function InterfaceFFI绑定其他语言的基础见 c_api/INSTALL.md。本文完成的任务是从源码构建 C API 动态库用官方 C 示例程序验证整个调用流程然后梳理你在 Rust、Julia 等语言中做 FFI 集成时需要面对的函数命名规则、内存释放和错误处理方式。前提条件来自 INSTALL.mdCMake 构建环境支持 OpenMP 2.0 及以上版本的 C20 编译器一个 BLAS 实现。构建 C API 动态库C API 是主 Faiss 构建的一部分通过 CMake 开关启用在 Faiss 仓库根目录执行# Configure with C API enabled $ cmake -B build -DFAISS_ENABLE_C_APION . # Build $ make -C build -j faiss_c注意FAISS_ENABLE_C_API默认是OFF见根目录 CMakeLists.txt 中的 option 定义所以必须显式传入-DFAISS_ENABLE_C_APION。构建成功后得到动态库libfaiss_c.somacOS 上是.dylib其中包含完整的 Faiss 实现和 C 接口的封装函数。如果你的 Rust/Julia 程序需要直接链接这个库建议把库和头文件安装到系统目录$ make -C build install根据 c_api/CMakeLists.txt 的安装规则C API 的头文件会安装到包含目录下的faiss/c_api子目录包括impl/、utils/子目录动态库安装到库目录${CMAKE_INSTALL_LIBDIR}。用官方示例程序验证构建结果构建完库之后先编译并运行官方 C 示例确认 CMake 配置、链接和调用链没有问题$ make -C build -j example_c示例程序位于build/c_api/example_c运行它即可。示例源码在 c_api/example_c.c它完整地演示了 C API 的典型调用顺序生成随机数据维度d 128库大小nb 100000查询数nq 10000用工厂函数faiss_index_factory(index, d, Flat, METRIC_L2)创建索引faiss_Index_add(index, nb, xb)添加向量faiss_Index_search以k 5搜索通过FaissSearchParameters配合FaissIDSelectorRange、FaissIDSelectorOr、FaissIDSelectorAnd执行带 ID 筛选条件的faiss_Index_search_with_paramsfaiss_write_index_fname(index, example.index)把索引写入磁盘faiss_Index_free(index)释放索引。程序运行时会依次打印 Generating some data...、Building an index...、is_trained true、ntotal计数、各次搜索结果的I行每行是id (d距离)对以及 Saving index to disk...、Freeing index...、Done.。运行结束后当前目录会生成example.index文件。这些输出和落盘文件就是判断示例跑通的标准后续你在其他语言中移植同一段调用流程时可以逐一对应。C 接口的命名规则与核心调用做 FFI 绑定时需要知道 C 接口如何映射 C API。根据 c_api/INSTALL.md头文件按«name»_c.h命名«name»与 C 类名对应例如 Index_c.h 对应基类IndexAPI函数以faiss_为前缀例如faiss_IndexFlat_new新类型以Faiss为前缀例如FaissIndex、FaissMetricTypeC 的成员函数一般以faiss_«classname»_«member»的形式暴露例如idx_t ntotal faiss_Index_ntotal(index);几个对 FFI 声明有直接影响的类型定义见 c_api/faiss_c.h索引类型idx_t是int64_t向量分量和距离都是float。跨语言声明函数签名时按这些类型对应即可。创建索引使用工厂函数faiss_index_factory声明在AutoTune_c.hFaissIndex* index NULL; int c faiss_index_factory(index, 64, Flat, METRIC_L2); if (c) { // operation failed }添加向量并检查结果int c faiss_Index_add(index, nb, xb); if (c) { printf(%s, faiss_get_last_error()); exit(-1); }带参数的搜索以示例程序中的 ID 区间筛选为例先创建选择器再包装成搜索参数传给faiss_Index_search_with_params用完立即释放idx_t* I malloc(k * nq * sizeof(idx_t)); float* D malloc(k * nq * sizeof(float)); FaissIDSelectorRange* sel NULL; FAISS_TRY(faiss_IDSelectorRange_new(sel, 50, 100)); FaissSearchParameters* params NULL; FAISS_TRY(faiss_SearchParameters_new(params, sel)); FAISS_TRY(faiss_Index_search_with_params(index, nq, xq, k, params, D, I)); faiss_SearchParameters_free(params); faiss_IDSelectorRange_free(sel);其中FAISS_TRY是 example_c.c 里定义的错误处理宏非零返回值时打印最后一条错误信息并退出。由于这是 C 接口索引必须由你手动释放faiss_Index_free(index);错误处理机制错误处理依赖操作返回的错误码有可恢复错误的操作返回错误码错误码标识底层抛出的异常类型getter 函数和free函数不返回错误码见 c_api/INSTALL.md。错误码定义在 c_api/error_c.h错误码值含义OK0无错误UNKNOWN_EXCEPT-1除 Faiss 或标准 C 库异常之外的异常FAISS_EXCEPT-2Faiss 库异常STD_EXCEPT-4标准 C 库异常获取具体错误信息调用faiss_get_last_error()。注意文档中说明的返回值生命周期该指针只在另一次 Faiss 函数调用之前有效所以在跨 FFI 边界使用时应立即把错误消息拷贝到自己的内存里不要长期持有这个指针。可选分支GPU 版本如果希望从 Rust/Julia 同时使用 GPU 索引可以构建 GPU 版 C API。配置时同时打开 GPU 和 C API$ cmake -B build -DFAISS_ENABLE_GPUON -DFAISS_ENABLE_C_APION . $ make -C build -j gpufaiss_c产物是libgpufaiss_c.so它同时包含 GPU 与 CPU 实现可以替代libfaiss_c.so使用该库动态链接 CUDA 运行库和 cuBLAS。C API 中获取 GPU 资源与迁移索引的方式FaissStandardGpuResources* gpu_res NULL; int c faiss_StandardGpuResources_new(gpu_res); if (c) { printf(%s, faiss_get_last_error()); exit(-1); } FaissIndex* cpu_index NULL; c faiss_index_factory(cpu_index, d, Flat, METRIC_L2); if (c) { /* ... */ } FaissGpuIndex* gpu_index NULL; c faiss_index_cpu_to_gpu(gpu_res, 0, cpu_index, gpu_index); if (c) { /* ... */ }GPU 示例程序用make -C build -j example_gpu_c构建位于build/c_api/gpu/example_gpu_c可参照 c_api/gpu/example_gpu_c.c 验证 GPU 调用链。从 C 示例迁移到你的语言文档没有提供 Rust 或 Julia 的现成绑定示例绑定层需要你自己基于上述头文件编写以c_api/下的_c.h头文件为准声明函数原型和Faiss*不透明类型链接libfaiss_c.so然后按本文的调用顺序工厂创建 → add → search / search_with_params → free组织逻辑。移植后可以用两条标准核对结果程序按示例的调用顺序执行时各操作返回OK0出错时faiss_get_last_error()能给出可读的异常信息。【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻