Python을 통한 Java에서 프레젠테이션 BLOB을 관리하여 효율적인 메모리 사용

개요

Aspose.Slides는 프레젠테이션의 대용량 바이너리 데이터를 BLOB 기반으로 처리하여 큰 이미지, 오디오, 비디오 및 프레젠테이션 파일을 작업할 때 메모리 사용량을 줄이는 데 도움을 줍니다.

이 문서에서는 BLOB 기반 처리를 사용하여 프레젠테이션에 대용량 미디어를 추가하고, 프레젠테이션에서 대용량 미디어를 내보내며, 대용량 프레젠테이션을 보다 효율적으로 로드하는 방법을 보여 줍니다. 또한 처리 중에 임시 파일을 사용할 수 있는 방법과 임시 파일이 저장되는 폴더를 변경하는 방법에 대해서도 설명합니다.

BLOB에 대해

BLOB(Binary Large Object)은 일반적으로 바이너리 형식으로 저장된 큰 항목(사진, 프레젠테이션, 문서 또는 미디어)입니다.

Aspose.Slides for Python via Java는 대용량 파일을 다룰 때 메모리 사용량을 줄이는 방식으로 객체에 BLOB을 사용할 수 있게 합니다.

BLOB을 사용하여 메모리 사용량 감소

BLOB을 사용하여 프레젠테이션에 대용량 파일 추가

Aspose.Slides for Python via Java를 사용하면 BLOB을 포함하는 프로세스를 통해 대용량 파일(이 경우 큰 비디오 파일)을 추가하여 메모리 사용량을 줄일 수 있습니다.

다음 Python 코드는 BLOB 프로세스를 통해 큰 비디오 파일을 프레젠테이션에 추가하는 방법을 보여 줍니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadingStreamBehavior, Presentation, SaveFormat
from java.io import FileInputStream

path_to_very_large_video = "veryLargeVideo.avi"

# 비디오를 추가할 새 프레젠테이션을 생성합니다.
presentation = Presentation()
try:
    file_stream = FileInputStream(path_to_very_large_video)
    try:
        # 비디오 파일에 접근할 의도가 없으므로 스트림을 잠금 상태로 유지합니다.
        video = presentation.getVideos().addVideo(file_stream, LoadingStreamBehavior.KeepLocked)
        presentation.getSlides().get_Item(0).getShapes().addVideoFrame(0, 0, 480, 270, video)

        # 메모리 사용량을 낮게 유지하면서 프레젠테이션을 저장합니다.
        presentation.save("presentationWithLargeVideo.pptx", SaveFormat.Pptx)
    finally:
        file_stream.close()
finally:
    presentation.dispose()

BLOB을 사용하여 프레젠테이션에서 대용량 파일 내보내기

Aspose.Slides for Python via Java를 사용하면 BLOB을 포함하는 프로세스를 통해 프레젠테이션에서 대용량 파일(예: 오디오 또는 비디오 파일)을 내보낼 수 있습니다. 예를 들어 프레젠테이션에서 큰 미디어 파일을 추출하고 싶지만 해당 파일을 컴퓨터 메모리로 로드하고 싶지 않을 때 유용합니다. BLOB 프로세스를 통해 파일을 내보내면 메모리 사용량을 낮게 유지할 수 있습니다.

다음 Python 코드는 이 작업을 시연합니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadOptions, Presentation, PresentationLockingBehavior

huge_presentation_file = "LargeVideoFileTest.pptx"

load_options = LoadOptions()
# 소스 파일을 메모리로 로드하지 않고 잠급니다.
load_options.getBlobManagementOptions().setPresentationLockingBehavior(PresentationLockingBehavior.KeepLocked)

presentation = Presentation(huge_presentation_file, load_options)
try:
    # 버퍼를 통해 비디오 데이터를 전송하여 메모리 사용량을 낮게 유지합니다.
    buffer = jpype.JArray(jpype.JByte)(8 * 1024)

    for index in range(presentation.getVideos().size()):
        video = presentation.getVideos().get_Item(index)

        # 전체 비디오를 바이트 배열로 로드하는 대신 스트림을 사용합니다.
        video_stream = video.getStream()
        try:
            with open(f"video{index}.avi", "wb") as output_stream:
                bytes_read = video_stream.read(buffer, 0, len(buffer))
                while bytes_read > 0:
                    chunk = bytes(buffer[:bytes_read])
                    output_stream.write(chunk)
                    bytes_read = video_stream.read(buffer, 0, len(buffer))
        finally:
            video_stream.close()
    # 필요할 경우 오디오 파일에도 동일한 단계를 적용합니다.
finally:
    presentation.dispose()

이미지를 BLOB로 프레젠테이션에 추가

ImageCollection 클래스의 메서드를 사용하면 큰 이미지를 스트림으로 추가하여 BLOB로 처리할 수 있습니다.

다음 Python 코드는 BLOB 프로세스를 통해 큰 이미지를 추가하는 방법을 보여 줍니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadingStreamBehavior, Presentation, SaveFormat, ShapeType
from java.io import FileInputStream

path_to_large_image = "large_image.jpg"

# 이미지를 추가할 새 프레젠테이션을 생성합니다.
presentation = Presentation()
try:
    file_stream = FileInputStream(path_to_large_image)
    try:
        # 이미지 파일에 접근할 의도가 없으므로 스트림을 잠금 상태로 유지합니다.
        image = presentation.getImages().addImage(file_stream, LoadingStreamBehavior.KeepLocked)
        presentation.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle, 0, 0, 300, 200, image)

        # 메모리 사용량을 낮게 유지하면서 프레젠테이션을 저장합니다.
        presentation.save("presentationWithLargeImage.pptx", SaveFormat.Pptx)
    finally:
        file_stream.close()
finally:
    presentation.dispose()

메모리와 대용량 프레젠테이션

일반적으로 대용량 프레젠테이션을 로드하려면 컴퓨터에 많은 임시 메모리가 필요합니다. 프레젠테이션의 모든 내용이 메모리로 로드되고, 프레젠테이션을 로드한 파일은 더 이상 사용되지 않습니다.

예를 들어 1.5 GB 비디오 파일을 포함한 대용량 PowerPoint 프레젠테이션(large.pptx)이 있다고 가정합니다. 이 프레젠테이션을 로드하는 표준 방법은 다음 Python 코드에 설명되어 있습니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("large.pptx")
try:
    presentation.save("large.pdf", SaveFormat.Pdf)
finally:
    presentation.dispose()

하지만 이 방법은 약 1.6 GB의 임시 메모리를 사용합니다.

BLOB로 대용량 프레젠테이션 로드

BLOB 처리를 사용하면 적은 메모리로 대용량 프레젠테이션을 로드할 수 있습니다. 다음 Python 코드는 BLOB 처리를 사용하여 대용량 프레젠테이션 파일(large.pptx)을 로드하는 방법을 보여 줍니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadOptions, Presentation, PresentationLockingBehavior, SaveFormat

load_options = LoadOptions()
load_options.getBlobManagementOptions().setPresentationLockingBehavior(PresentationLockingBehavior.KeepLocked)
load_options.getBlobManagementOptions().setTemporaryFilesAllowed(True)

presentation = Presentation("large.pptx", load_options)
try:
    presentation.save("large.pdf", SaveFormat.Pdf)
finally:
    presentation.dispose()

임시 파일 폴더 변경

BLOB 프로세스를 사용할 때 컴퓨터는 기본 임시 파일 폴더에 임시 파일을 생성합니다. 임시 파일을 다른 폴더에 보관하려면 BlobManagementOptions.setTempFilesRootPath를 사용하여 저장 위치를 변경할 수 있습니다:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import LoadOptions, PresentationLockingBehavior

load_options = LoadOptions()
load_options.getBlobManagementOptions().setPresentationLockingBehavior(PresentationLockingBehavior.KeepLocked)
load_options.getBlobManagementOptions().setTemporaryFilesAllowed(True)
load_options.getBlobManagementOptions().setTempFilesRootPath("temp")

프레젠테이션 객체를 해제하여 메모리 해제

대용량 프레젠테이션을 처리할 때는 Presentation 인스턴스를 적절히 해제하여 차지하던 메모리를 반환해야 합니다. 프레젠테이션 사용을 마친 후에는 Presentation.dispose를 호출해 관리되지 않는 리소스를 해제합니다.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("large.pptx")
try:
    # ...프레젠테이션을 처리합니다...
    presentation.save("large.pdf", SaveFormat.Pdf)
finally:
    # 명시적으로 리소스를 해제합니다.
    presentation.dispose()

FAQ

Aspose.Slides 프레젠테이션에서 어떤 데이터가 BLOB으로 처리되며 BLOB 옵션으로 제어됩니까?
이미지, 오디오, 비디오와 같은 대용량 바이너리 객체가 BLOB으로 처리됩니다. 프레젠테이션 파일 자체도 로드하거나 저장할 때 BLOB 처리가 적용됩니다. 이러한 객체는 메모리 사용량을 관리하고 필요 시 임시 파일로 스필하도록 하는 BLOB 정책에 의해 제어됩니다.

프레젠테이션 로드 중에 BLOB 처리 규칙은 어디에서 설정합니까?
LoadOptions와 함께 BlobManagementOptions를 사용합니다. 여기서 BLOB의 메모리 상한을 지정하고, 임시 파일 사용 여부를 허용하거나 차단하며, 임시 파일 루트 경로와 소스 잠금 동작을 선택할 수 있습니다.

BLOB 설정이 성능에 영향을 주나요? 속도와 메모리 사용량을 어떻게 균형 맞추나요?
예. BLOB을 메모리에 유지하면 속도가 가장 빠르지만 RAM 사용량이 늘어납니다. 메모리 상한을 낮추면 작업이 더 많이 임시 파일로 이동해 RAM 사용량은 줄어들지만 추가 I/O가 발생합니다. 워크로드와 환경에 맞는 균형을 맞추려면 setMaxBlobsBytesInMemory 메서드를 사용하십시오.

극히 큰 프레젠테이션(예: 여러 기가바이트) 열 때 BLOB 옵션이 도움이 되나요?
예. BlobManagementOptions는 이러한 시나리오를 위해 설계되었습니다. 임시 파일을 활성화하고 소스 잠금을 사용하면 피크 RAM 사용량을 크게 낮추고 매우 큰 파일을 안정적으로 처리할 수 있습니다.

스트림 대신 디스크 파일에서 로드할 때도 BLOB 정책을 사용할 수 있나요?
예. 동일한 규칙이 스트림에도 적용됩니다. 프레젠테이션 인스턴스는 선택한 잠금 모드에 따라 입력 스트림을 소유하고 잠글 수 있으며, 허용된 경우 임시 파일이 사용되어 처리 중 메모리 사용량을 예측 가능하게 유지합니다.