จัดการ BLOB ในงานพรีเซนเทชันด้วย Python เพื่อการใช้หน่วยความจำที่มีประสิทธิภาพ

ภาพรวม

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"

# Creates a new presentation to which the video will be added
with slides.Presentation() as pres:
    with open(pathToVeryLargeVideo, "br") as fileStream:
        # Let's add the video to the presentation - we chose the KeepLocked behavior because we do
        # not intend to access the "veryLargeVideo.avi" file.
        video = pres.videos.add_video(fileStream, slides.LoadingStreamBehavior.KEEP_LOCKED)
        pres.slides[0].shapes.add_video_frame(0, 0, 480, 270, video)

        # Saves the presentation. While a large presentation gets outputted, the memory consumption
        # stays low through the pres object's lifecycle 
        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)

หน่วยความจำและพรีเซนเทชันขนาดใหญ่

โดยทั่วไป การโหลดพรีเซนเทชันขนาดใหญ่คอมพิวเตอร์จะต้องใช้หน่วยความจำชั่วคราวจำนวนมาก เนื้อหาทั้งหมดของพรีเซนเทชันจะถูกโหลดเข้าสู่หน่วยความจำและไฟล์ต้นทาง (ไฟล์ที่ใช้โหลดพรีเซนเทชัน) จะหยุดใช้งาน

ให้พิจารณาพรีเซนเทชัน PowerPoint ขนาดใหญ่ (large.pptx) ที่มีไฟล์วิดีโอขนาด 1.5 GB วิธีมาตรฐานในการโหลดพรีเซนเทชันนี้แสดงในโค้ด 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"

ปล่อยอ็อบเจ็กต์ Presentation เพื่อคืนหน่วยความจำ

เมื่อทำงานกับพรีเซนเทชันขนาดใหญ่ ควรตรวจสอบให้แน่ใจว่าอินสแตนซ์ Presentation ถูกทำลายอย่างถูกต้องเพื่อให้หน่วยความจำที่ใช้งานถูกปล่อยออก วิธีที่แนะนำคือใช้คอนเท็กซ์แมเนเจอร์ (with slides.Presentation(...) as presentation:) เหมือนในตัวอย่างด้านบน; มันจะปิดพรีเซนเทชันและปล่อยทรัพยากรที่ไม่ได้จัดการโดยอัตโนมัติเมื่อออกจากบล็อก

หากคุณสร้างพรีเซนเทชันโดยไม่ใช้บล็อก with ให้เรียก presentation.dispose() อย่างชัดเจนหลังจากใช้เสร็จ และลบการอ้างอิงที่เหลืออยู่ทั้งหมดเพื่อให้ garbage collector ของ Python สามารถกรีบหน่วยความจำคืนได้

import aspose.slides as slides

presentation = slides.Presentation("large.pptx")

# ...ประมวลผลพรีเซนเทชัน...
presentation.save("large.pdf", slides.export.SaveFormat.PDF)

# ปล่อยทรัพยากรโดยเจาะจง.
presentation.dispose()

FAQ

ข้อมูลใดในพรีเซนเทชัน Aspose.Slides ที่ถือเป็น BLOB และถูกควบคุมโดยตัวเลือก BLOB?

ออบเจ็กต์ไบนารีขนาดใหญ่เช่นรูปภาพ, เสียง, และวิดีโอถูกจัดการเป็น BLOB ทั้งไฟล์พรีเซนเทชันทั้งหมดก็เกี่ยวข้องกับการจัดการ BLOB เมื่อมีการโหลดหรือบันทึก ออบเจ็กต์เหล่านี้อยู่ภายใต้นโยบาย BLOB ที่ช่วยให้คุณจัดการการใช้หน่วยความจำและสลับไปใช้ไฟล์ชั่วคราวเมื่อจำเป็น

ฉันกำหนดกฎการจัดการ BLOB ระหว่างการโหลดพรีเซนเทชันได้ที่ไหน?

ใช้ LoadOptions พร้อมกับ BlobManagementOptions ที่นั่นคุณสามารถตั้งค่าขีดจำกัดหน่วยความจำสำหรับ BLOB, เปิดหรือปิดการใช้ไฟล์ชั่วคราว, เลือกโฟลเดอร์รากสำหรับไฟล์ชั่วคราว, และกำหนดพฤติกรรมการล็อกแหล่งข้อมูล

การตั้งค่า BLOB มีผลต่อประสิทธิภาพหรือไม่ และฉันจะปรับสมดุลระหว่างความเร็วกับหน่วยความจำอย่างไร?

มีผล การเก็บ BLOB ในหน่วยความจำทำให้ความเร็วสูงสุดแต่ใช้ RAM มากขึ้น; การลดขีดจำกัดหน่วยความจำจะย้ายงานส่วนใหญ่ไปใช้ไฟล์ชั่วคราว ลด RAM แต่เพิ่ม I/O ปรับค่าเกณฑ์ max_blobs_bytes_in_memory ให้เหมาะสมกับภาระงานและสภาพแวดล้อมของคุณ

ตัวเลือก BLOB ช่วยเมื่อเปิดพรีเซนเทชันที่ใหญ่มาก (เช่นหลายกิกะไบต์) หรือไม่?

ช่วย BlobManagementOptions ถูกออกแบบมาสำหรับสถานการณ์ดังกล่าว: การเปิดไฟล์ชั่วคราวและการล็อกแหล่งข้อมูลสามารถลดการใช้ RAM สูงสุดและทำให้การประมวลผลพรีเซนเทชันขนาดใหญ่มาก ๆ มีเสถียรภาพมากขึ้น

ฉันสามารถใช้กฎ BLOB เมื่อต้องโหลดจากสตรีมแทนไฟล์บนดิสก์ได้หรือไม่?

ได้ กฎเดียวกันใช้กับสตรีม: อินสแตนซ์พรีเซนเทชันสามารถเป็นเจ้าของและล็อกสตรีมอินพุต (ขึ้นอยู่กับโหมดล็อกที่เลือก) และไฟล์ชั่วคราวจะถูกใช้เมื่ออนุญาต ทำให้การใช้หน่วยความจำคาดเดาได้ตลอดการประมวลผล