ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 AWS SDK for C++ TransferManager 实现 Amazon S3 大对象内存流上传下载

使用 AWS SDK for C++ TransferManager 实现 Amazon S3 大对象内存流上传下载 使用 AWS SDK for C TransferManager 实现 Amazon S3 大对象内存流上传下载【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址: https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples导读本文以 transfer-manager 代码示例目录 为核心深入讲解如何在 AWS SDK for C 中利用TransferManager组件将大文件以**内存流in-memory stream**方式上传到 Amazon S3 并下载回内存全程不落地到本地磁盘。读完本文你将掌握TransferManager的配置方式、线程池执行器的工作原理、内存流回调解读以及使用md5sum校验传输完整性的完整实战流程并了解它与此仓库中S3Clients3 目录和S3CrtClients3-crt 目录三条 S3 接入路径的差异与适用场景。TransferManager 是什么为什么比裸 S3Client 更适合大对象官方 README 明确说明本目录示例采用TransferManager以获得优于S3Client的上传/下载性能。从仓库结构看AWS SDK for C 提供了三条访问 S3 的路径各有侧重s3 目录基于S3Client的标准 API 示例覆盖CreateBucket、PutObject、GetObject、ListBuckets、对象完整性等大量单动作与场景示例适合精细控制每一次 API 调用。s3-crt 目录基于S3CrtClientAWS Common Runtime 客户端通过并行请求实现高性能分片上传与 Range GET 下载并在 s3-crt-demo.cpp 中演示了throughputTargetGbps、partSize等吞吐配置。transfer-manager 目录基于TransferManager的高级封装自动将大文件切分为多个分片并发传输同时允许通过回调把数据流导向自定义目标如内存缓冲区本目录唯一示例 transferOnStream.cpp 即展示了这一能力。简言之TransferManager隐藏了多线程分片、失败重试、进度追踪等复杂度让调用方以文件路径 ↔ S3 对象或数据流 ↔ S3 对象的简洁语义完成传输。核心示例transferOnStream.cpp 全流程剖析本目录唯一的代码示例是 transferOnStream.cpp它演示通过内存流使用 TransferManager 上传/下载大对象。完整流程如下用本地文件 [LocalFilePath] 上传到 S3 桶 [Bucket] 的对象键 [Key]将该对象从 S3 下载到内存缓冲区而非本地文件把内存数据落盘为 [LocalFilePath]_copy供md5sum校验两文件内容一致。命令行参数与用法程序运行时需传入 3 个位置参数参数不足时打印如下用法说明并返回 -1Usage: program [Bucket] [Key] [LocalFilePath]Bucket目标 S3 桶名称KeyS3 对象键LocalFilePath本地待上传文件路径下载后校验副本将生成于LocalFilePath_copy。示例./run_transferOnStream my-bucket my-large-file /tmp/data.bin # 校验上传文件与内存下载落盘的副本是否一致 md5sum /tmp/data.bin /tmp/data.bin_copy内存流实现自定义 IOStream为了把下载数据接进内存示例自定义了继承Aws::IOStream的流类型见 transferOnStream.cppclass MyUnderlyingStream : public Aws::IOStream { public: using Base Aws::IOStream; // Provide a customer-controlled streambuf to hold data from the bucket. explicit MyUnderlyingStream(std::streambuf* buf) : Base(buf) {} ~MyUnderlyingStream() override default; };其核心是注入调用方控制的std::streambuf从而把 SDK 写出的字节导向由Aws::Utils::Stream::PreallocatedStreamBuf包装的预分配内存缓冲区。关键缓冲与线程池配置static const size_t BUFFER_SIZE 512 * 1024 * 1024; // 512MB BufferBUFFER_SIZE定义接收缓冲区大小为512MB需保证大于待下载对象大小PooledThreadExecutor以25 个线程的线程池驱动分片并发传输见 transferOnStream.cpp线程数可按机器核数与带宽调整PreallocatedStreamBuf streamBuffer(...)使用buffer.GetUnderlyingData()与buffer.GetLength()包装预分配内存源码注释特别强调该局部变量被 lambda 按引用捕获必须存活到transfer_manager全部下载任务完成否则会导致悬垂引用——这是内存流方案最重要的生命周期约束。客户端、配置与 TransferManager 创建auto s3_client Aws::MakeSharedAws::S3::S3Client(S3Client); auto executor Aws::MakeSharedAws::Utils::Threading::PooledThreadExecutor(executor, 25); Aws::Transfer::TransferManagerConfiguration transfer_config(executor.get()); transfer_config.s3Client s3_client; ... auto transfer_manager Aws::Transfer::TransferManager::Create(transfer_config);要点TransferManagerConfiguration必须指定执行器executor与底层S3Clients3Client也可传入自定义配置区域、凭证、Endpoint 等的S3Client从而在传输层之上复用既有的客户端级设置TransferManager::Create返回shared_ptr内部负责调度上传/下载任务到线程池。上传UploadFile 与状态等待auto uploadHandle transfer_manager-UploadFile(LOCAL_FILE, BUCKET, KEY, text/plain, Aws::MapAws::String, Aws::String()); uploadHandle-WaitUntilFinished(); bool success uploadHandle-GetStatus() Transfer::TransferStatus::COMPLETED;UploadFile参数依次为本地文件路径、桶名、对象键、Content-Type此处为text/plain、自定义元数据 MapWaitUntilFinished()阻塞当前线程直至任务结束异步场景下可改用回调监听GetStatus()返回TransferStatus枚举与TransferStatus::COMPLETED比较判断成败失败时通过GetLastError()获取AWSError打印err.GetMessage()定位原因。下载到内存lambda 回调流auto downloadHandle transfer_manager-DownloadFile(BUCKET, KEY, []() { return Aws::NewMyUnderlyingStream(TestTag, streamBuffer); }); downloadHandle-WaitUntilFinished();DownloadFile的重载接收一个返回shared_ptrIOStream的工厂回调SDK 每次需要写目标流时都会调用该 lambda从而把对象内容持续写入streamBuffer对应的内存。注意TestTag是 AWS 内存分配的标签名便于内存跟踪工具归类。下载完成后示例执行了两重正确性验证assert(downloadHandle-GetBytesTotalSize() downloadHandle-GetBytesTransferred());断言总字节数等于已传输字节数从 SDK 侧确认下载完整无缺失随后把buffer中的内存数据按GetBytesTransferred()实际长度写入[LocalFilePath]_copy供外部工具比对。构建与运行从 CMakeLists 看编译链路仓库为每个服务子目录提供 CMake 构建文件本目录的 CMakeLists.txt 关键点如下最低 CMake 版本3.13项目名tm-examplesC 标准C11set(SERVICE_COMPONENTS transfer)与find_package(AWSSDK REQUIRED COMPONENTS ${SERVICE_COMPONENTS})必须安装并链接 SDK 的transfer组件transfer组件依赖s3与core组件file(GLOB ... *.cpp)自动收集目录下全部源文件并为每个源文件生成run_源文件名可执行目标同时以target_link_libraries(... ${AWSSDK_LINK_LIBRARIES})链接 SDK 库默认开启BUILD_SHARED_LIBS共享库Windows/MSVC 下通过AWSSDK_CPY_DYN_LIBS把运行期 DLL 复制到输出目录若存在tests/test_名称.cpp且启用了BUILD_TESTING会额外生成test_名称测试目标并注册到 CTest。典型的配置与构建命令需先完成 AWS SDK for C 的安装参见 cpp/README.rst 中的 Prerequisites 部分cmake -S cpp/example_code/transfer-manager -B build/transfer-manager \ -DCMAKE_BUILD_TYPERelease -DBUILD_TESTINGOFF cmake --build build/transfer-manager --target run_transferOnStream构建产物run_transferOnStream位于 build 目录按上文命令行参数直接运行即可。仓库根目录的 run_automated_tests.py 也提供了自动化测试入口如python3 run_automated_tests.py -23 -s s3并支持通过PARALLEL_BUILD环境变量开启并行编译。运行前的必要准备与安全提示原 README 强调运行示例前必须先完成 AWS SDK for C 的安装与设置即 Getting Started 流程并参考代码示例的结构说明完成构建。同时注意以下要点见 transfer-manager/README.md最小权限原则仅为代码授予完成该任务所需的最低 IAM 权限本示例至少需要目标桶的s3:PutObject与s3:GetObject区域可用性代码未经所有 AWS 区域测试部分服务仅在特定区域可用费用提醒运行示例含单元测试可能产生 AWS 账户费用凭证配置示例通过默认凭证链获取 AWS 凭证运行前需确保本地已配置凭证如环境变量或~/.aws/credentials。相关资源与延伸阅读本示例源码transferOnStream.cpp构建配置CMakeLists.txt面向S3Client的标准 API 示例cpp/example_code/s3/README.md面向S3CrtClient的高吞吐分片示例cpp/example_code/s3-crt/README.md 与 s3-crt-demo.cppC 示例的整体构建与自动化测试说明cpp/README.rst若你追求极致吞吐且希望 SDK 自动完成分片并行传输可进一步参考 s3-crt 目录中对throughputTargetGbps、partSize的配置方式见 s3-crt-demo.cpp在TransferManagerConfiguration之外为 S3 大对象传输提供另一条高性能路径。【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址: https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表