首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pageblob与blob blob中下载blob

在pageblob与blob blob中下载blob
EN

Stack Overflow用户
提问于 2021-09-10 07:26:24
回答 2查看 41关注 0票数 1

如果我错了,请纠正我。PageBlob和BlockBlob的下载是否相同,而写入操作是否不同?我假设下载是相同的,因为如果我们有一个blob URI,我们可以只使用GET来下载blob。最后,有没有文档支持我的假设,即无论是哪种类型的blob,下载的blob都是相同的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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已经实现了稀疏下载。

票数 2
EN

Stack Overflow用户

发布于 2021-09-10 11:09:00

通常,Pageblob很大,它们充当虚拟机的卷。

“页面blobs由总大小最大为8 TB的512字节页面组成,专为频繁的随机读/写操作而设计。”

Microsoft documentation了解更多关于页面Blob的信息。

Azure存储中将有三种不同类型的Blob,Page,Append,Blob。

下面的Python代码将帮助我们将blob下载到本地存储。

代码语言:javascript
复制
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的代码将帮助您了解处理页面斑点的高级方法

代码语言:javascript
复制
#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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69128675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档