minio 使用aws c++ 多线程下载

编程入门 行业动态 更新时间:2024-10-10 06:15:31

minio 使用aws c++ <a href=https://www.elefans.com/category/jswz/34/1767532.html style=多线程下载"/>

minio 使用aws c++ 多线程下载

C++ 下载 Minio 文件

下载 aws-sdk-cpp

  1. git clone --recurse-submodules GitHub - aws/aws-sdk-cpp: AWS SDK for C++

麒麟上编译AWS

cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/home/ht706/aws/tcs/install -DCMAKE_INSTALL_PREFIX=/home/ht706/aws/tcs/install -DLibCrypto_INCLUDE_DIR=/home/ht706/aws/tcs/install/include -DBUILD_SHARED_LIBS=on -DNO_WGNU=OFF -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF

多线程下载

// 只要设置HTTP请求头的Range属性, 就可以实现从指定位置开始下载
/*
表示头500个字节:Range: bytes=0-499
表示第二个500字节:Range: bytes=500-999
表示最后500个字节:Range: bytes=-500
表示500字节以后的范围:Range: bytes=500-
*/std::vector<MultiDownloadCtx> downloadParts;for (size_t i = 0; i < partNum; i++){std::stringstream rangeStream;rangeStream << "bytes=" << i * DOWNLOAD_DATA_SIZE_THRESHOLD << '-' <<((i == partNum - 1) ? filesize - 1: ((i + 1) * DOWNLOAD_DATA_SIZE_THRESHOLD - 1));downloadParts.emplace_back();downloadParts.back().m_partNumber = i;downloadParts.back().getObjectRequest.WithBucket(fromBucket).WithKey(objectFile).WithRange(rangeStream.str());}for (int i = 0; i < downloadParts.size(); i++){MultiDownloadCtx& ctx = downloadParts[i];m_threadPool->AddJob([&]()-> void {objectFile;int partSize = ctx.m_partNumber == partNum - 1 ?(int)(filesize -(size_t)ctx.m_partNumber * DOWNLOAD_DATA_SIZE_THRESHOLD): DOWNLOAD_DATA_SIZE_THRESHOLD;ByteArrayStreamBuf* buf = appender.GetBuffer(m_threadPool->GetThreadIdx());LogDEBUG("Start downloading part %d, range: %s, part size: %d\n",ctx.m_partNumber, ctx.getObjectRequest.GetRange().c_str(),partSize);// Clear the stream as aws sdk expects a clean stream returned from// response stream factory each time when retry on network errorsctx.getObjectRequest.SetResponseStreamFactory([&buf]()-> Aws::IOStream*{ buf->reset(); return Aws::New<Aws::IOStream>("SR_MULTI_PART_DOWNLOAD", buf); });Aws::S3::Model::GetObjectOutcome outcome = s3_client->GetObject(ctx.getObjectRequest);buf->updateSize(partSize);if (outcome.IsSuccess()){LogDEBUG("Download part %d succeed, download size: %d",ctx.m_partNumber, partSize);ctx.m_outcome = RemoteStorageRequestOutcome::SUCCESS;appender.WritePartToOutputStream(m_threadPool->GetThreadIdx(),ctx.m_partNumber);doDownloadStatus(objectFile, filesize, partSize);}else{ctx.m_outcome = handleError(outcome.GetError());}});}m_threadPool->WaitAll();

运行现象

视频

petal_20230328_164338

交流qq :690759587  qq群:691104042

更多推荐

minio 使用aws c++ 多线程下载

本文发布于:2024-03-09 18:42:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725768.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多线程   minio   aws

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!