使用AWS s3 cpp sdk,我们尝试使用以下代码读取存储桶。当我们使用
指定一个小范围时Aws::S3::Model::GetObjectRequest object_request;
object_request.SetRange(std::to_string(position) + "-" + std::to_string(position + nbytes));
因此,起始位置为0,结束位置为4。我们发现读操作实际上读的字节比我们分配给缓冲区的字节多。所以我们有一个69字节长的文件。如果我们尝试从中读取前4个字节,那么结果将从
返回auto results = this->s3Client->GetObject(object_request);
我们发现从服务器读取的实际大小为69字节。文件的整个大小。当您指定非常小的操作时,是否存在sdk将尝试读取的最小值?这个值是否记录在某处?
以下是尝试从s3读取数据的实际功能。
arrow::Status S3ReadableFile::Read(int64_t nbytes, int64_t* bytesRead, uint8_t* buffer) {
Aws::S3::Model::GetObjectRequest object_request;
object_request.SetBucket(bucketName);
object_request.SetKey(key);
object_request.SetRange(std::to_string(position) + "-" + std::to_string(position + nbytes));
auto results = this->s3Client->GetObject(object_request);
if (!results.IsSuccess()) {
//TODO: Make bad arrow status here
*bytesRead = 0;
return arrow::Status::IOError("Unable to fetch object from s3 bucket.");
} else {
//byutes read should always be full amount
*bytesRead = nbytes; //should almost always be nBytes
memcpy(buffer, results.GetResult().GetBody().rdbuf(), *bytesRead);
position += *bytesRead;
return arrow::Status::OK();
}
}
这些是S3ReadableFile类的私有成员
std::shared_ptr<Aws::S3::S3Client> s3Client;
std::string bucketName;
std::string key;
size_t position;
bool valid;
答案 0 :(得分:0)
Range的值应为&#34; bytes = 0-4&#34; 请参阅:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35
答案 1 :(得分:0)
请确保您不执行以下操作
# wrong way of using ss
std::stringstream ss("bytes=");
ss << beg << '-' << end;
object_request.SetRange(ss.str().c_str());
假设beg为0,结束为10,
此操作无效,因为它将0-10
传递给SDK。如果它不符合https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35,即bytes=0-10
,它将下载所有字节。
正确的是,
std::stringstream ss();
ss << "bytes=" << beg << '-' << end;
object_request.SetRange(ss.str().c_str());
我花了很长时间才弄清楚!