簡體   English   中英

使用Boto從AWS Glacier下載大型存檔

[英]Downloading a large archive from AWS Glacier using Boto

我正在嘗試使用Python包Boto從Glacier下載大型存檔(~1 TB)。 我使用的當前方法如下所示:

import os
import boto.glacier
import boto
import time

ACCESS_KEY_ID = 'XXXXX'
SECRET_ACCESS_KEY = 'XXXXX'
VAULT_NAME = 'XXXXX'
ARCHIVE_ID = 'XXXXX'
OUTPUT = 'XXXXX'

layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
                              aws_secret_access_key = SECRET_ACCESS_KEY)

gv = layer2.get_vault(VAULT_NAME)

job = gv.retrieve_archive(ARCHIVE_ID)
job_id = job.id

while not job.completed:
    time.sleep(10)
    job = gv.get_job(job_id)

if job.completed:
    print "Downloading archive"
    job.download_to_file(OUTPUT)

問題是作業ID在24小時后到期,這還不足以檢索整個存檔。 我需要將下載分解為至少4個。 我該怎么做並將輸出寫入單個文件?

看來你可以在調用job.download_to_file時簡單地指定chunk_size參數, job.download_to_file所示:

if job.completed:
    print "Downloading archive"
    job.download_to_file(OUTPUT, chunk_size=1024*1024)

但是,如果您無法在24小時內下載所有塊,我認為您不能選擇僅使用layer2下載您錯過的那個塊。

第一種方法

使用layer1,您只需使用方法get_job_output並指定要下載的字節范圍。

看起來像這樣:

file_size = check_file_size(OUTPUT)

if job.completed:
    print "Downloading archive"
    with open(OUTPUT, 'wb') as output_file:
        i = 0
        while True:
            response = gv.get_job_output(VAULT_NAME, job_id, (file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
            output_file.write(response)
            if len(response) < 1024 * 1024:
                break
            i += 1

使用此腳本,您應該能夠在腳本失敗時重新運行該腳本,並繼續將您的存檔下載到您離開的位置。

第二種方法

通過挖掘boto代碼,我在Job類中找到了一個你也可以使用的“私有”方法: _download_byte_range 使用此方法,您仍然可以使用layer2。

file_size = check_file_size(OUTPUT)

if job.completed:
    print "Downloading archive"
    with open(OUTPUT, 'wb') as output_file:
        i = 0
        while True:
            response = job._download_byte_range(file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
            output_file.write(response)
            if len(response) < 1024 * 1024:
                break
            i += 1

您必須在boto.connect_glacier函數中添加region_name,如下所示:

    layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
                                aws_secret_access_key = SECRET_ACCESS_KEY,
                                region_name = 'your region name')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM