【问题标题】:Fastest way to get objects from s3 to ec2 PHP将对象从 s3 获取到 ec2 PHP 的最快方法
【发布时间】:2017-10-04 08:18:42
【问题描述】:

在 S3 上,我在这个层次结构中有大约 100M(每个 2.5M)的文件:

id_folder / date_folder / hour_file.raw

我尝试了 3 种不同的方式来尽快获取它们:

我从 laravel 存储门面开始(我正在使用 laravel)..

存储::disk('s3')->get($filePath); -> 这个是最慢的

然后我google了一下,我找到了这个类: Amazon S3 PHP 类 http://undesigned.org.za/2007/10/22/amazon-s3-php-class/

我也尝试使用亚马逊关于创建 S3Client 的说明并使用 getObject 函数,但它仍然很慢......

所以,我需要从 s3 到 ec2 获取大量文件 - 最快的方法是什么?
谢谢!

【问题讨论】:

  • S3 和 EC2 之间的通信已经很快

标签: php laravel amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

如果我理解你所说的一切,那么下载这么多对象的速度就没有办法解决了。 100,000,000 * 2.5MB = 250TB。这是很多数据。不过,您可以采取一些措施来提高效率。

如果您尝试通过使用S3\Client::getObjects 同步下载来“一次”获取多个(即数千个)对象,则需要很长时间。使用返回Guzzle\Promise\PromiseS3\Client::getObjectsAsync 会更快一些。这并不是真正的异步。对 S3 的所有请求不会同时执行。无论如何,调用getObjectsAsync 将阻塞线程,直到请求完成。并且简单地遍历一个循环并调用Guzzle\Promise\Promise::wait 仍然需要很长时间。

但是,如果您分解请求并同时分批执行它们,您可以从请求中节省大量时间。 Guzzle 提供了一个 few options 来等待一系列承诺,但我更喜欢 Guzzle\Promise\unwrap 函数。它返回给它的 promise 数组的结果数组。

下面是我编写的一个生成器:

public function getObjectsBatch($bucket, $keys, $chunkSize = 350)
{
    foreach (array_chunk($keys, $chunkSize) as $chunk) {
        $promises = [];
        foreach ($chunk as $key) {
            $promises[] = $this->getClient()->getObjectAsync([
                'Bucket' => $bucket,
                'Key' => $key
            ])->then($success = function (Result $res) use ($key) {
                $res->offsetSet('Key', $key);
                return $res;
            }, $fail = function (S3Exception $res)  {
                return $res;
            });
        }
        yield unwrap($promises);
    }
}

我正在使用它来下载数千个对象,并在下载时将它们流式传输给用户。

批次的大小很重要。在示例中,我一次执行 350 个请求。我做了一些测试,这似乎是最有效的。在我的测试中,我使用不同的批量从 S3 下载了 4500 个对象。我对每个批次大小进行了 10 次测试。 350 似乎是最有效的。

但您的特定用例(一次下载 250TB 的数据)无论采用何种方式都将需要很长时间。如果您不将文件保存到磁盘,您将很快耗尽内存,那么您还必须担心磁盘空间。我不确定您为什么需要下载这么多文件,但这似乎不是一个好主意。

【讨论】:

  • 如何使用这个生成器?用foreach? foreach (getObjectsBatch() as $result) ?我得到未定义的函数“unwrap()”。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多