Zarządzaj BLOB‑ami prezentacji w PHP dla efektywnego wykorzystania pamięci
Przegląd
Aspose.Slides zapewnia obsługę BLOB‑ów dla dużych danych binarnych w prezentacjach, aby pomóc zmniejszyć zużycie pamięci przy pracy z dużymi obrazami, dźwiękiem, wideo i plikami prezentacji.
Ten artykuł pokazuje, jak używać przetwarzania opartego na BLOB‑ach do dodawania dużych mediów do prezentacji, eksportowania dużych mediów z prezentacji oraz bardziej efektywnego ładowania dużych prezentacji. Wyjaśnia także, jak w trakcie przetwarzania można korzystać z plików tymczasowych i jak zmienić folder ich przechowywania.
O BLOB
BLOB (Binary Large Object) jest zwykle dużym elementem (zdjęcie, prezentacja, dokument lub media) zapisywanym w formatach binarnych.
Aspose.Slides for PHP via Java umożliwia użycie BLOB‑ów dla obiektów w sposób redukujący zużycie pamięci, gdy występują duże pliki.
Info
Aby obejść pewne ograniczenia przy interakcji ze strumieniami, Aspose.Slides może kopiować zawartość strumienia. Ładowanie dużej prezentacji poprzez jej strumień spowoduje skopiowanie zawartości prezentacji i spowolni ładowanie. Dlatego, gdy zamierzasz ładować dużą prezentację, zdecydowanie zalecamy użycie ścieżki do pliku prezentacji, a nie jej strumienia.Użyj BLOB, aby zmniejszyć zużycie pamięci
Dodaj duży plik jako BLOB do prezentacji
Aspose.Slides for Java umożliwia dodanie dużych plików (w tym przypadku dużego pliku wideo) przy użyciu procesu obejmującego BLOB, aby zmniejszyć zużycie pamięci.
Ten przykład w Java pokazuje, jak dodać duży plik wideo przy użyciu procesu BLOB do prezentacji:
$pathToVeryLargeVideo = "veryLargeVideo.avi";
# Tworzy nową prezentację, do której zostanie dodane wideo
$pres = new Presentation();
try {
$fileStream = new Java("java.io.FileInputStream", $pathToVeryLargeVideo);
try {
# Dodajmy wideo do prezentacji – wybraliśmy zachowanie KeepLocked, ponieważ nie zamierzamy
# uzyskać dostępu do pliku "veryLargeVideo.avi".
$video = $pres->getVideos()->addVideo($fileStream, LoadingStreamBehavior->KeepLocked);
$pres->getSlides()->get_Item(0)->getShapes()->addVideoFrame(0, 0, 480, 270, $video);
# Zapisuje prezentację. Podczas generowania dużej prezentacji zużycie pamięci
# pozostaje niskie w całym cyklu życia obiektu pres
$pres->save("presentationWithLargeVideo.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($fileStream)) {
$fileStream->close();
}
}
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Eksportuj duży plik przy użyciu BLOB z prezentacji
Aspose.Slides for PHP via Java umożliwia eksportowanie dużych plików (w tym przypadku pliku audio lub wideo) przy użyciu procesu obejmującego BLOB z prezentacji. Na przykład możesz potrzebować wyodrębnić duży plik multimedialny z prezentacji, ale nie chcesz, aby plik został wczytany do pamięci komputera. Eksportując plik przy użyciu procesu BLOB, utrzymujesz niskie zużycie pamięci.
Ten kod demonstruje opisaną operację:
$hugePresentationWithAudiosAndVideosFile = "LargeVideoFileTest.pptx";
$loadOptions = new LoadOptions();
# Blokuje plik źródłowy i NIE ładuje go do pamięci
$loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
# Tworzy instancję Presentation, blokuje plik "hugePresentationWithAudiosAndVideos.pptx".
$pres = new Presentation($hugePresentationWithAudiosAndVideosFile, $loadOptions);
try {
# Zapiszmy każde wideo do pliku. Aby zapobiec dużemu zużyciu pamięci, potrzebny jest bufor, który będzie używany
# do przenoszenia danych ze strumienia wideo w prezentacji do strumienia nowo utworzonego pliku wideo.
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = new JavaClass("java.lang.Byte");
$buffer = $Array->newInstance($Byte, 8 * 1024);
# Przechodzi przez wszystkie wideo
for($index = 0; $index < java_values($pres->getVideos()->size()) ; $index++) {
$video = $pres->getVideos()->get_Item($index);
# Otwiera strumień wideo w prezentacji. Proszę zauważyć, że celowo uniknęliśmy dostępu do właściwości
# takich jak video.BinaryData - ponieważ ta właściwość zwraca tablicę bajtów zawierającą całe wideo, co
# powoduje załadowanie bajtów do pamięci. Używamy video.GetStream, który zwróci Stream - i nie
# wymaga od nas załadowania całego wideo do pamięci.
$presVideoStream = $video->getStream();
try {
$outputFileStream = new Java("java.io.FileOutputStream", "video" . $index . ".avi");
try {
$bytesRead;
while ($bytesRead = $presVideoStream->read($buffer, 0, java_values($Array->getLength($buffer))) > 0) {
$outputFileStream->write($buffer, 0, $bytesRead);
}
} finally {
$outputFileStream->close();
}
} finally {
$presVideoStream->close();
}
# Zużycie pamięci pozostanie niskie niezależnie od rozmiaru wideo lub prezentacji.
}
# W razie potrzeby możesz zastosować te same kroki dla plików audio.
} catch (JavaException $e) {
} finally {
$pres->dispose();
}
Dodaj obraz jako BLOB do prezentacji
Przy pomocy metod klasy ImageCollection możesz dodać duży obraz jako strumień, aby był traktowany jako BLOB.
Ten kod PHP pokazuje, jak dodać duży obraz przy użyciu procesu BLOB:
$pathToLargeImage = "large_image.jpg";
# tworzy nową prezentację, do której zostanie dodany obraz.
$pres = new Presentation();
try {
$fileStream = new Java("java.io.FileInputStream", $pathToLargeImage);
try {
# Dodajmy obraz do prezentacji – wybieramy zachowanie KeepLocked, ponieważ nie
# zamierzamy uzyskać dostępu do pliku "largeImage.png" file.
$img = $pres->getImages()->addImage($fileStream, LoadingStreamBehavior->KeepLocked);
$pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, 300, 200, $img);
# Zapisuje prezentację. Podczas generowania dużej prezentacji zużycie pamięci
# pozostaje niskie w całym cyklu życia obiektu pres
$pres->save("presentationWithLargeImage.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($fileStream)) {
$fileStream->close();
}
}
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Pamięć i duże prezentacje
Zazwyczaj, aby załadować dużą prezentację, komputery potrzebują dużo pamięci tymczasowej. Cała zawartość prezentacji jest wczytywana do pamięci, a plik, z którego prezentacja została wczytana, przestaje być używany.
Rozważ dużą prezentację PowerPoint (large.pptx) zawierającą plik wideo o wielkości 1,5 GB. Standardowa metoda ładowania prezentacji jest opisana w tym kodzie PHP:
$pres = new Presentation("large.pptx");
try {
$pres->save("large.pdf", SaveFormat::Pdf);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Jednak metoda ta zużywa około 1,6 GB pamięci tymczasowej.
Ładuj dużą prezentację jako BLOB
Przy użyciu procesu obejmującego BLOB możesz wczytać dużą prezentację, używając niewiele pamięci. Ten kod PHP opisuje implementację, w której proces BLOB jest używany do wczytania dużego pliku prezentacji (large.pptx):
$loadOptions = new LoadOptions();
$loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
$loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
$pres = new Presentation("large.pptx", $loadOptions);
try {
$pres->save("large.pdf", SaveFormat::Pdf);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Zmień folder dla plików tymczasowych
Kiedy proces BLOB jest używany, komputer tworzy pliki tymczasowe w domyślnym folderze dla plików tymczasowych. Jeśli chcesz, aby pliki tymczasowe były przechowywane w innym folderze, możesz zmienić ustawienia przechowywania przy użyciu setTempFilesRootPath:
$loadOptions = new LoadOptions();
$loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
$loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
$loadOptions->getBlobManagementOptions()->setTempFilesRootPath("temp");
Info
Kiedy używaszsetTempFilesRootPath, Aspose.Slides nie tworzy automatycznie folderu do przechowywania plików tymczasowych. Musisz utworzyć ten folder ręcznie.
Zwolnij obiekty prezentacji, aby uwolnić pamięć
Podczas przetwarzania dużych prezentacji upewnij się, że instancja Presentation jest odpowiednio zwolniona, aby pamięć, którą zajmowała, została zwolniona. Wywołaj dispose() po zakończeniu pracy z prezentacją, aby uwolnić niezarządzane zasoby.
$presentation = new Presentation("large.pptx");
# ...przetwórz prezentację...
$presentation->save("large.pdf", SaveFormat::Pdf);
# Jawnie zwolnij zasoby.
$presentation->dispose();
FAQ
Jakie dane w prezentacji Aspose.Slides są traktowane jako BLOB i kontrolowane przez opcje BLOB?
Duże obiekty binarne, takie jak obrazy, audio i wideo, są traktowane jako BLOB. Cały plik prezentacji również podlega obsłudze BLOB podczas ładowania lub zapisywania. Obiekty te są regulowane przez polityki BLOB, które umożliwiają zarządzanie użyciem pamięci i przenoszenie danych do plików tymczasowych w razie potrzeby.
Gdzie konfiguruję zasady obsługi BLOB podczas ładowania prezentacji?
Użyj klasy LoadOptions wraz z BlobManagementOptions. Tam ustawiasz limit pamięci RAM dla BLOB, zezwalasz lub blokujesz pliki tymczasowe, wybierasz ścieżkę główną dla plików tymczasowych oraz określasz zachowanie blokowania źródła.
Czy ustawienia BLOB wpływają na wydajność i jak zbalansować szybkość względem pamięci?
Tak. Przechowywanie BLOB w pamięci maksymalizuje szybkość, ale zwiększa zużycie RAM; obniżenie limitu pamięci przenosi więcej operacji do plików tymczasowych, zmniejszając RAM kosztem dodatkowego I/O. Użyj metody setMaxBlobsBytesInMemory, aby osiągnąć odpowiednią równowagę dla swojego obciążenia i środowiska.
Czy opcje BLOB pomagają przy otwieraniu wyjątkowo dużych prezentacji (np. gigabajtowych)?
Tak. BlobManagementOptions są przeznaczone do takich scenariuszy: włączenie plików tymczasowych i użycie blokowania źródła może znacznie zmniejszyć szczytowe użycie RAM i ustabilizować przetwarzanie bardzo dużych zestawów slajdów.
Czy mogę używać polityk BLOB przy ładowaniu ze strumieni zamiast plików na dysku?
Tak. Te same zasady dotyczą strumieni: instancja prezentacji może posiadać i blokować strumień wejściowy (w zależności od wybranego trybu blokowania), a pliki tymczasowe są używane, gdy jest to dozwolone, co utrzymuje przewidywalne zużycie pamięci podczas przetwarzania.