[英]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.