如果我错了,请纠正我。PageBlob和BlockBlob的下载是否相同,而写入操作是否不同?我假设下载是相同的,因为如果我们有一个blob URI,我们可以只使用GET来下载blob。最后,有没有文档支持我的假设,即无论是哪种类型的blob,下载的blob都是相同的。
发布于 2021-09-10 11:15:42
答案既是肯定的,也是否定的。
所有类型的blob的下载都是相同的,也就是说,下载任何blob最终都将执行Get Blob REST API操作。执行此操作时,您可以下载任何类型的blob。
但是,使用页面blob,只需下载占用的页面范围,就可以优化下载。这称为Sparse Download。基本上,您首先要做的是在页面blob中执行find the occupied page ranges,然后只下载占用的页面范围。这样,你将能够更快地下载页面斑点。例如,如果您有一个128 it的页面blob,但它只包含32 it的数据(其余为空),那么通过使用稀疏下载方法,您将只下载32 it的数据。对于其他blob类型,这是不可能的。
我还没有签入最新版本的Storage SDK,但我非常确定当涉及到页面blob下载时,SDK已经实现了稀疏下载。
发布于 2021-09-10 11:09:00
通常,Pageblob很大,它们充当虚拟机的卷。
“页面blobs由总大小最大为8 TB的512字节页面组成,专为频繁的随机读/写操作而设计。”
Microsoft documentation了解更多关于页面Blob的信息。
Azure存储中将有三种不同类型的Blob,Page,Append,Blob。
下面的Python代码将帮助我们将blob下载到本地存储。
import logging
import os
import azure.functions as func
from azure.storage.blob import BlobServiceClient, BlobClient
from azure.storage.blob import ContentSettings, ContainerClient
logging.info('Python HTTP trigger function processed a request.')
MY_CONNECTION_STRING = "STORAGE_ACCOUNT_STRING"
CONTAINER = "CONTAINERNAME"
LOCAL_PATH = "REPLACE_THIS"
class AzureBlobFileDownloader:
def __init__(self):
self.blob_service_client = BlobServiceClient.from_connection_string(MY_CONNECTION_STRING)
self.my_container = self.blob_service_client.get_container_client(CONTAINER)
def save_blob(self,file_name,file_content):
# Get full path to the file
download_file_path = os.path.join(LOCAL_PATH, file_name)
# for nested blobs, create local path as well!
os.makedirs(os.path.dirname(download_file_path), exist_ok=True)
with open(download_file_path, "wb") as file:
file.write(file_content)
def download_blobs_in_container(self):
my_blobs = self.my_container.list_blobs()
for blob in my_blobs:
print(blob.name)
bytes = self.my_container.get_blob_client(blob).download_blob().readall()
self.save_blob(blob.name, bytes)
# Call the class.
azure_blob_file_downloader = AzureBlobFileDownloader()
azure_blob_file_downloader.download_all_blobs_in_container()下面来自Azure Python SDK的代码将帮助您了解处理页面斑点的高级方法
#Page Blob Operations
def page_blob_operations(self, account):
file_to_upload = "HelloWorld.png"
page_size = 1024;
# Create an page blob service object
pageblob_service = account.create_page_blob_service()
container_name = 'pageblobcontainer' + self.random_data.get_random_name(6)
try:
# Create a new container
print('1. Create a container with name - ' + container_name)
pageblob_service.create_container(container_name)
# Create a new page blob to upload the file
print('2. Create a page blob')
pageblob_service.create_blob(container_name, file_to_upload, page_size * 1024)
# Read the file
print('3. Upload pages to page blob')
index = 0
with open(file_to_upload, "rb") as file:
file_bytes = file.read(page_size)
while len(file_bytes) > 0:
if len(file_bytes) < page_size:
file_bytes = bytes(file_bytes + bytearray(page_size - len(file_bytes)))
pageblob_service.update_page(container_name, file_to_upload, file_bytes, index * page_size, index * page_size + page_size - 1)
file_bytes = file.read(page_size)
index = index + 1
pages = pageblob_service.get_page_ranges(container_name, file_to_upload)
print('4. Enumerate pages in page blob')
for page in pages:
print('Page ' + str(page.start) + ' - ' + str(page.end))
finally:
print('5. Delete container')
if pageblob_service.exists(container_name):
pageblob_service.delete_container(container_name)请看一下高级示例,这些示例展示了如何处理来自Azure SDK for Python的分页、分块和追加blobs。
有关在NodeJS中处理blobs的信息,请参阅Azure Docs。
https://stackoverflow.com/questions/69128675
复制相似问题