使用 Python 管理簡報中的 BLOB 以提升記憶體使用效率
概述
Aspose.Slides 提供基於 BLOB 的處理方式,用於簡報中大型二進位資料,協助在處理大型圖像、音訊、影片以及簡報檔案時降低記憶體消耗。
本文說明如何使用基於 BLOB 的處理將大型媒體新增至簡報、從簡報匯出大型媒體,以及更有效率地載入大型簡報。亦說明如何在處理過程中使用暫存檔,以及如何變更用來儲存這些檔案的資料夾。
關於 BLOB
BLOB(Binary Large Object)通常指以二進位格式儲存的大型項目(照片、簡報、文件或媒體)。
Aspose.Slides for Python via .NET 讓您能以減少記憶體消耗的方式,對大型檔案使用 BLOB 物件。
使用 BLOB 減少記憶體消耗
透過 BLOB 將大型檔案新增至簡報
Aspose.Slides for .NET 允許您透過 BLOB 流程將大型檔案(此例為大型影片檔)新增至簡報,以降低記憶體消耗。
以下 Python 程式示範如何透過 BLOB 流程將大型影片檔新增至簡報:
import aspose.slides as slides
pathToVeryLargeVideo = "veryLargeVideo.avi"
# 建立一個新的簡報,將把影片新增至其中
with slides.Presentation() as pres:
with open(pathToVeryLargeVideo, "br") as fileStream:
# 讓我們將影片新增至簡報 - 我們選擇 KeepLocked 行為,因為我們
# 不打算存取 "veryLargeVideo.avi" 檔案。
video = pres.videos.add_video(fileStream, slides.LoadingStreamBehavior.KEEP_LOCKED)
pres.slides[0].shapes.add_video_frame(0, 0, 480, 270, video)
# 儲存簡報。雖然輸出的是大型簡報,記憶體使用量
# 在 pres 物件的生命週期內保持低水平
pres.save("presentationWithLargeVideo.pptx", slides.export.SaveFormat.PPTX)
透過 BLOB 從簡報匯出大型檔案
Aspose.Slides for Python via .NET 允許您透過 BLOB 流程從簡報匯出大型檔案(此例為音訊或影片檔)。例如,您可能需要從簡報中擷取大型媒體檔案,但不想將該檔案載入電腦記憶體。透過 BLOB 流程匯出檔案,可保持低記憶體使用量。
以下 Python 程式碼示範上述操作:
import aspose.slides as slides
loadOptions = slides.LoadOptions()
loadOptions.blob_management_options = slides.BlobManagementOptions()
loadOptions.blob_management_options.presentation_locking_behavior = slides.PresentationLockingBehavior.KEEP_LOCKED
loadOptions.blob_management_options.is_temporary_files_allowed = True
with slides.Presentation(path + "Video.pptx", loadOptions) as pres:
# 讓我們將每個影片儲存為檔案。為了防止高記憶體使用,我們需要一個緩衝區來使用
# 將簡報影片串流的資料傳輸到新建立的影片檔案的串流。
# byte[] buffer = new byte[8 * 1024];
bufferSize = 8 * 1024
# 逐一處理影片
index = 0
# 如有需要,您可以對音訊檔案套用相同的步驟。
for video in pres.videos:
# 開啟簡報的影片串流。請注意,我們刻意避免存取屬性
# 如 video.BinaryData - 因為此屬性會回傳包含完整影片的位元組陣列,接著
# 會導致位元組載入記憶體。我們使用 video.GetStream,它會回傳 Stream,而且不會
# 需要我們將整個影片載入記憶體。
with video.get_stream() as presVideoStream:
with open("video{index}.avi".format(index = index), "wb") as outputFileStream:
buffer = presVideoStream.read(8 * 1024)
bytesRead = len(buffer)
while bytesRead > 0:
outputFileStream.write(buffer)
buffer = presVideoStream.read(8 * 1024)
bytesRead = len(buffer)
index += 1
在簡報中以 BLOB 新增影像
使用 ImageCollection 類別的方法,您可以將大型影像以資料流方式新增,使其被視為 BLOB。
以下 Python 程式碼示範如何透過 BLOB 流程新增大型影像:
import aspose.slides as slides
# 建立一個新的簡報,將在其中新增影像。
with slides.Presentation() as pres:
with open("img.jpeg", "br") as fileStream:
img = pres.images.add_image(fileStream, slides.LoadingStreamBehavior.KEEP_LOCKED)
pres.slides[0].shapes.add_picture_frame(slides.ShapeType.RECTANGLE, 0, 0, 300, 200, img)
pres.save("presentationWithLargeImage.pptx", slides.export.SaveFormat.PPTX)
記憶體與大型簡報
通常,載入大型簡報時,電腦需要大量暫存記憶體。簡報的所有內容會被載入記憶體,且載入來源的檔案不再被使用。
以包含 1.5 GB 影片檔的大型 PowerPoint 簡報 (large.pptx) 為例。載入此簡報的標準方法如以下 Python 程式碼所示:
import aspose.slides as slides
with slides.Presentation("large.pptx") as pres:
pres.save("large.pdf", slides.export.SaveFormat.PDF)
但此方法會消耗約 1.6 GB 的暫存記憶體。
以 BLOB 載入大型簡報
透過 BLOB 流程,您可以在使用極少記憶體的情況下載入大型簡報。以下 Python 程式碼示範使用 BLOB 流程載入大型簡報檔案 (large.pptx):
import aspose.slides as slides
loadOptions = slides.LoadOptions()
loadOptions.blob_management_options = slides.BlobManagementOptions()
loadOptions.blob_management_options.presentation_locking_behavior = slides.PresentationLockingBehavior.KEEP_LOCKED
loadOptions.blob_management_options.is_temporary_files_allowed = True
with slides.Presentation("large.pptx", loadOptions) as pres:
pres.save("large.pdf", slides.export.SaveFormat.PDF)
變更暫存檔的資料夾
當使用 BLOB 流程時,電腦會在預設的暫存檔資料夾中建立暫存檔。若您希望將暫存檔儲存於其他資料夾,可使用 temp_files_root_path 變更儲存設定:
import aspose.slides as slides
loadOptions = slides.LoadOptions()
loadOptions.blob_management_options = slides.BlobManagementOptions()
loadOptions.blob_management_options.presentation_locking_behavior = slides.PresentationLockingBehavior.KEEP_LOCKED
loadOptions.blob_management_options.is_temporary_files_allowed = True
loadOptions.blob_management_options.temp_files_root_path = "temp"
Info
當您使用temp_files_root_path 時,Aspose.Slides 不會自動建立用來儲存暫存檔的資料夾。您必須自行手動建立該資料夾。
釋放簡報物件以釋放記憶體
在處理大型簡報時,請確保正確釋放 Presentation 例項,以釋放其佔用的記憶體。建議使用上下文管理器(with slides.Presentation(...) as presentation:)如上述範例所示;區塊結束時會自動關閉簡報並釋放非受管理資源。
若未使用 with 區塊建立簡報,請在使用完畢後明確呼叫 presentation.dispose(),並移除任何剩餘的參考,以讓 Python 的垃圾回收機制回收記憶體。
import aspose.slides as slides
presentation = slides.Presentation("large.pptx")
# ...處理簡報...
presentation.save("large.pdf", slides.export.SaveFormat.PDF)
# 明確釋放資源。
presentation.dispose()
常見問題
在 Aspose.Slides 簡報中,哪些資料會被視為 BLOB 並受 BLOB 選項控制?
大型二進位物件(如影像、音訊與影片)會被視為 BLOB。整個簡報檔案在載入或儲存時也會涉及 BLOB 處理。這些物件受 BLOB 政策管理,可讓您在需要時控制記憶體使用量並將資料寫入暫存檔。
在載入簡報時,我該如何設定 BLOB 處理規則?
使用 LoadOptions 搭配 BlobManagementOptions。在此您可以設定 BLOB 的記憶體上限、是否允許暫存檔、暫存檔的根目錄路徑,以及來源鎖定行為。
BLOB 設定會影響效能嗎?我要如何在速度與記憶體之間取得平衡?
會的。將 BLOB 保持於記憶體中可提升速度,但會增加 RAM 使用量;降低記憶體上限會將更多工作轉移至暫存檔,減少 RAM 需求但會產生額外 I/O。可調整 max_blobs_bytes_in_memory 閾值,以在您的工作負載與環境中取得適當的平衡。
在開啟極大型簡報(例如數 GB)時,BLOB 選項是否有幫助?
會的。BlobManagementOptions 正是為此類情境設計:啟用暫存檔與使用來源鎖定可顯著降低峰值 RAM 使用量,並使處理極大型簡報更為穩定。
我能在從串流而非磁碟檔案載入時使用 BLOB 政策嗎?
會的。相同的規則亦適用於串流:簡報例項可以擁有並鎖定輸入串流(視所選的鎖定模式而定),允許時會使用暫存檔,以在處理過程中維持可預測的記憶體使用量。