如何限制S3&使用boto进行冰川上传/下载速度?

时间:2014-07-11 16:54:00

标签: python boto

我正在使用boto上传和下载文件到S3&冰川。

如何限制/限制上传和下载速度?

3 个答案:

答案 0 :(得分:2)

似乎没有直接可用的解决方案

免责声明:我经常使用boto for S3,并且还有使用Amazon Glacier的经验。我还查看了当前版本的boto并快速检查了源代码以获得当前的知识,但是有一点点机会,我可能是错的。

  • S3和Amazon Glacier下载和上传方法都没有提供限制速度的选项。
  • 有res_download_handler的概念,它可以处理S3对象的下载,但boto中唯一可用的处理程序实现是ResumableDownloadHandler。
  • 对于Amazon Glacier,文件存在问题Please add ability to throttle upload bandwidth used by the glacier client ,该问题已被接受,但仍然可以打开。

搜索可能的解决方案

编写自己的下载处理程序

这可以用于S3下载,因为这些方法允许设置这样的处理程序。

你必须自己编写这样的处理程序。

对于S3,使用cb参数和#34;位阻塞"行为

上传和下载S3对象的功能提供参数cb,您可以在其中定义在上传/下载一定数量的数据后重复调用的函数。

理论上,可以创建这样一个可调用的,可以记录自上次调用以来的时间和数据量,并等待一段时间来限制速度。

我没有为Amazon Glacier找到类似的选项。

答案 1 :(得分:0)

最简单的方法是在linux下使用流量整形工具,比如tc。这些工具可让您控制带宽甚至模拟网络数据包丢失甚至长途通信问题。易于编写python脚本以通过shell控制端口行为。

答案 2 :(得分:0)

我已经为s3 boto python库实现了一个速率限制进度类,如下所示:假设您的每秒速率高于该速率限制,并且似乎可以正常工作。

class ProgressPercentage(object):
    def __init__(self, rate_limit=-1):
        self._seen_so_far = 0
        self.rate_limit = rate_limit
        self.bytes_check = 0
        self._lock = threading.Lock()
        self.check_time = datetime.datetime.now()

    def __call__(self, bytes_amount):
        with self._lock:
            self._seen_so_far += bytes_amount

            if self.rate_limit > 0:
                # assumes one thread
                self.bytes_check += bytes_amount
                elapsed_time = datetime.datetime.now() - self.check_time
                total_seconds = elapsed_time.total_seconds()
                if self.bytes_check > self.rate_limit:
                    if total_seconds < 1:
                        time.sleep(1.0 - total_seconds)
                    self.bytes_check = 0
                    self.check_time = datetime.datetime.now()

            if sys.stderr.isatty():
                sys.stderr.write(
                    "\r{0}".format(size_str(self._seen_so_far)))
                sys.stderr.flush()

如本例中所示,呼叫限制为每秒100k:

s3_client.upload_file(file_name, bucket_name, key, Callback=ProgressPercentage(100000))