- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 AWS CPP SDK ( https://github.com/aws/aws-iot-device-sdk-cpp ) 在小型 Linux 系统(只有 32 MB RAM)上从 S3 下载文件。我正在使用 GetObjectRequest 类,如下所示。它运行良好,并将文件下载到我系统上的 FStream,这样它就不会消耗太多 RAM。
现在,我想将下载代码转换为 TransferManager 方法以获得进度回调。我已经重写了那部分代码,它也显示在下面。它开始时很好,打印下载的百分比,但是当它达到 ~14 MB RAM(大约是下载时 Linux 中可用的数量)时,它会因为使用过多的 RAM 而被内核杀死。
我创建了一个文件流,就像我为 GetObjectRequest 所做的那样。我究竟做错了什么?我怎样才能解决这个问题?谢谢。
没有使用所有 RAM 的旧方法:
// Old way
GetObjectRequest getObjectRequest;
getObjectRequest.SetBucket(bucket.c_str());
getObjectRequest.SetKey(keyName.c_str());
getObjectRequest.SetResponseStreamFactory([&destination](){
return Aws::New<Aws::FStream>(
"s3file", destination, std::ios_base::out); });
GetObjectOutcome getObjectOutcome = SessionClient->GetObject(getObjectRequest);
if(getObjectOutcome.IsSuccess())
{
std::cout << "<AWS DOWNLOAD> Get FW success!" << std::endl;
}
else
{
std::cout << "<AWS DOWNLOAD> Get FW failed: " << getObjectOutcome.GetError().GetMessage() << std::endl;
exit(1);
}
最终使用过多 RAM 并被内核杀死的新方法:
// New way
Aws::Transfer::TransferManagerConfiguration transferConfig;
transferConfig.s3Client = SessionClient;
std::shared_ptr<Aws::Transfer::TransferHandle> requestPtr(nullptr);
transferConfig.downloadProgressCallback =
[](const Aws::Transfer::TransferManager*, const Aws::Transfer::TransferHandle& handle)
{
std::cout << "\r" << "<AWS DOWNLOAD> Download Progress: " << static_cast<int>(handle.GetBytesTransferred() * 100.0 / handle.GetBytesTotalSize()) << " Percent " << handle.GetBytesTransferred() << " bytes\n";
};
Aws::Transfer::TransferManager transferManager(transferConfig);
requestPtr = transferManager.DownloadFile(bucket.c_str(), keyName.c_str(), [&destination](){
Aws::FStream *stream = Aws::New<Aws::FStream>("s3file", destination, std::ios_base::out);
stream->rdbuf()->pubsetbuf(NULL, 0);
return stream; });
requestPtr->WaitUntilFinished();
size_t retries = 0;
//just make sure we don't fail because a download part failed. (e.g. network problems or interuptions)
while (requestPtr->GetStatus() == Aws::Transfer::TransferStatus::FAILED && retries++ < 5)
{
std::cout << "<AWS DOWNLOAD> FW Download trying download again!" << std::endl;
transferManager.RetryDownload(requestPtr);
requestPtr->WaitUntilFinished();
}
// Check status
if ( requestPtr->GetStatus() == Aws::Transfer::TransferStatus::COMPLETED ) {
if ( requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred() ) {
std::cout << "<AWS DOWNLOAD> Get FW success!" << std::endl;
exit(0);
}
else {
std::cout << "<AWS DOWNLOAD> Get FW failed - Bytes downloaded did not equal requested number of bytes: " << requestPtr->GetBytesTotalSize() << requestPtr->GetBytesTransferred() << std::endl;
exit(1);
}
}
else {
std::cout << "<AWS DOWNLOAD> Get FW failed - download was never completed even after retries" << std::endl;
exit(1);
}
最佳答案
TransferManager 只有在您处于 10mb 或更大的领域并且您想利用并行化时才真正使事情变得更容易。它会预先分配最大堆大小,并且不会增大堆的大小。鉴于您的 RAM 限制,我不会使用 TransferManager。您仍然可以收到进度通知。检查 AmazonWebServiceRequest 类中的回调机制。
关于c++ - AWS CPP TransferManager 与 GetObjectRequest 流到文件 fstream OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075209/
在使用 TransferManager 上传时,如果出现网络问题,将被捕获到异常 - AmazonClientException。在这种情况下,我是否必须中止当前的上传?如果我想再次上传文件,是否必须
我正尝试按照教程将文件从 Android SDK 上传到 S3,如概述 here .在成功验证我能够创建 CognitoCachingCredentialsProvider 后,我尝试从我的设备执行上
我正在使用 TransferManager 将文件上传到我的 s3 存储桶 .虽然文档说尽可能重用一个实例,但它也说一旦传输完成就应该调用关闭。 文档的相关部分: TransferManager is
我正在使用 Java AWS SDK 构建一个应用程序,该应用程序必须将一些文件上传到 S3。 如果我可以访问 TransferManager 对象 tx (在 Java 中),有什么方法可以获取信息
我正在使用TransferManager将我服务器上的一些文件异步上传到 S3。问题是它因未知原因而失败,并且我在日志中没有看到任何异常。 我在文档中看到一条注释,用于在传输失败时查看异常。问题是这需
我目前正在通过以下代码片段将名称与 prefix_ 匹配的 S3 文件夹下载到本地 TMP_FOLDER: TransferManager transferManager = Transfer
我从 AWS S3 下载,在方法结束时我想返回它的成功,但遗憾的是我不知道如何返回。 我试着用我得到的 TransferHandle 来做这件事,但似乎没有这个选项。 bool downloadObj
我想使用 AmazonAWS TransferManager 上传目录。我使用来自 TVM 的凭据成功创建了一个 AmazonS3Client。 当我尝试用它下载文件时,它会提示: final Mul
我想开始使用带有 UIL 的 Amazon TransferManager。 目前我正在使用 UIL,我扩展了 BaseImageDownloader 类并提供了输入流 return client.g
我有以下方法可以分段上传到 amazonS3: public static void uploadToS3UserPath(String filePath, String bucket, String
目前,我正在尝试将文件上传到亚马逊 S3 存储桶,我一直在对此进行一些研究,发现 TransferManager 类会将文件分割成小块,以便使用多个线程并行上传文件(如果文件)够大了。现在,在应用程序
我正在尝试使用 TranferManager 在 S3 中批量上传几个文件。下面是我的代码: @GetMapping("s3/batch/upload/base64") public void upl
我一直在阅读 TransferManager在用于执行 S3 上传的亚马逊 AWS SDK 中,提供的 API 允许非阻塞使用,但我不清楚底层实现是否真的执行异步 I/O。 我在 source-cod
我正在使用 AWS CPP SDK ( https://github.com/aws/aws-iot-device-sdk-cpp ) 在小型 Linux 系统(只有 32 MB RAM)上从 S3
我正在查看 AWS SDK 文档中提供的 TransferManager 的使用示例,特别是对于以下代码: TransferManager tx = new TransferManager(
几周来我一直在与 TransferManager 问题作斗争,我希望能得到一些反馈, 我有一个等待任务发送给它的服务器应用程序。其中一些任务需要上传到 S3。该任务包含我需要的所有上传信息,包括访问
我正在尝试使用 AWS C++ SDK 和 Aws::Transfer::TransferManager 将文件从 S3 下载到内存中。 我要使用的功能是: std::shared_ptr Downl
TransferManager 类已从 AWS sdk Java 2.x 中删除。 TransferManager 的替代方案是什么以及如何使用它 最佳答案 TransferManager 未被删除,
是否有 Swift 3.0 等同于: [[transferManager download:downloadRequest] continueWithExecutor:[AWSExecutor mai
[编辑]:问题的重点是如何在亚马逊的 .NET SDK 中正确使用 Amazon.Glacier.Transfer.ArchiveTransferManager.Upload。 我正在编写一个简单的应
我是一名优秀的程序员,十分优秀!