如何一次性访问boost circular buffer全部元素并写入指定shape的张量
解决方案
你需要根据是否可以修改缓冲区的类型定义,选择对应的实现方案:
方案1:可修改缓冲区定义(支持真正的一次性写入)
因为你存储的每个元素长度固定为30,建议将元素类型从std::vector<float>替换为std::array<float, 30>,替换后boost::circular_buffer内的所有浮点数据会连续存储,可直接通过内存映射实现一次性写入张量,以下以常用的PyTorch C++ API(LibTorch)为例:
#include <boost/circular_buffer.hpp> #include <array> #include <torch/torch.h> // 修改后的缓冲区定义 boost::circular_buffer<std::array<float, 30>> poses {20}; // 写入张量逻辑 if (poses.full()) { // 确认缓冲区已填满20个元素 torch::Tensor tensor = torch::from_blob( poses.array_one().first, // 取环形缓冲区连续存储段的首地址 {1, 20, 30}, torch::kFloat32 ).clone(); // 若不需要脱离缓冲区生命周期持有张量数据,可删除clone()减少一次拷贝 }
如果使用其他张量库(如TensorFlow C++、Eigen Tensor),逻辑完全一致:直接把环形缓冲区的连续内存地址映射到张量结构即可。
方案2:不可修改缓冲区定义
如果必须保留std::vector<float>作为元素类型,由于每个std::vector的底层数据存储在独立的堆内存上,无法直接一次性批量拷贝所有数据,可通过以下最高效的批量拷贝实现:
#include <boost/circular_buffer.hpp> #include <vector> #include <algorithm> #include <torch/torch.h> boost::circular_buffer<std::vector<float>> poses {20}; // 初始化目标张量 torch::Tensor tensor = torch::empty({1, 20, 30}, torch::kFloat32); float* tensor_data = tensor.data_ptr<float>(); // 批量拷贝每个vector的数据到张量对应偏移位置 for (size_t i = 0; i < poses.size(); ++i) { std::copy(poses[i].begin(), poses[i].end(), tensor_data + i * 30); }
内容的提问来源于stack exchange,提问作者Baddela yogitha
相关产品推荐
相关产品推荐

