Управление BLOB презентаций в C++ для эффективного использования памяти

Обзор

Aspose.Slides предоставляет обработку на основе BLOB для больших двоичных данных в презентациях, помогая уменьшить потребление памяти при работе с большими изображениями, аудио, видео и файлами презентаций.

В этой статье показано, как использовать обработку на основе BLOB для добавления больших медиафайлов в презентацию, экспорта больших медиафайлов из презентации и более эффективной загрузки больших презентаций. Также объясняется, как во время обработки можно использовать временные файлы и как изменить папку, используемую для их хранения.

О BLOB

BLOB (Binary Large Object) обычно представляет собой большой элемент (фото, презентацию, документ или медиа), сохранённый в двоичном формате.

Aspose.Slides for C++ позволяет использовать BLOB для объектов таким образом, который снижает потребление памяти при работе с большими файлами.

Использование BLOB для снижения потребления памяти

Добавление большого файла через BLOB в презентацию

Aspose.Slides for C++ позволяет добавлять большие файлы (в данном случае большой видеофайл) через процесс, использующий BLOB, чтобы уменьшить потребление памяти.

Этот C++‑код показывает, как добавить большой видеофайл через процесс BLOB в презентацию:

const String pathToVeryLargeVideo = u"veryLargeVideo.avi";

// Создаёт новую презентацию, в которую будет добавлено видео
auto pres = System::MakeObject<Presentation>();

auto fileStream = System::MakeObject<FileStream>(pathToVeryLargeVideo, FileMode::Open);
// Давайте добавим видео в презентацию — мы выбрали поведение KeepLocked, потому что мы
// не планируем обращаться к файлу "veryLargeVideo.avi".
auto video = pres->get_Videos()->AddVideo(fileStream, LoadingStreamBehavior::KeepLocked);
pres->get_Slides()->idx_get(0)->get_Shapes()->AddVideoFrame(0.0f, 0.0f, 480.0f, 270.0f, video);

// Сохраняет презентацию. Пока выводится большая презентация, потребление памяти
// остается низким на протяжении жизненного цикла объекта pres 
pres->Save(u"presentationWithLargeVideo.pptx", SaveFormat::Pptx);

Экспорт большого файла через BLOB из презентации

Aspose.Slides for C++ позволяет экспортировать большие файлы (в данном случае аудио‑ или видеофайл) через процесс, использующий BLOB, из презентаций. Например, вам может потребоваться извлечь большой медиафайл из презентации, но не загружать его в оперативную память компьютера. При экспорте файла через процесс BLOB потребление памяти остаётся низким.

Этот код на C++ демонстрирует описанную операцию:

const String hugePresentationWithAudiosAndVideosFile = u"Large  Video File Test1.pptx";

auto loadOptions = System::MakeObject<LoadOptions>();
loadOptions->get_BlobManagementOptions()->set_PresentationLockingBehavior(PresentationLockingBehavior::KeepLocked);

// Создаёт экземпляр Presentation и блокирует файл "hugePresentationWithAudiosAndVideos.pptx".
auto pres = System::MakeObject<Presentation>(hugePresentationWithAudiosAndVideosFile, loadOptions);
// Сохраним каждое видео в файл. Чтобы предотвратить высокое использование памяти, нам нужен буфер, который будет использован
// для передачи данных из видеопотока презентации в поток нового видеофайла.
auto buffer = System::MakeArray<uint8_t>(8 * 1024, 0);

// Iterates through the videos
for (int32_t index = 0; index < pres->get_Videos()->get_Count(); ++index)
{
	auto video = pres->get_Videos()->idx_get(index);

	// Открывает видеопоток презентации. Обратите внимание, что мы сознательно избегали обращения к методам
	// таким как video->get_BinaryData — потому что этот метод возвращает массив байтов, содержащий полное видео, что затем
	// загружает байты в память. Мы используем video->GetStream, который возвращает Stream — и НЕ
	// требует загрузки всего видео в память.
	
	auto presVideoStream = video->GetStream();

	auto outputFileStream = File::OpenWrite(String::Format(u"video{0}.avi", index));
	int32_t bytesRead;
	while ((bytesRead = presVideoStream->Read(buffer, 0, buffer->get_Length())) > 0)
	{
		outputFileStream->Write(buffer, 0, bytesRead);
	}
		
	// Потребление памяти останется низким независимо от размера видео или презентации,
}

// При необходимости вы можете применить те же шаги к аудиофайлам.

Добавление изображения как BLOB в презентацию

С помощью методов интерфейса IImageCollection и класса ImageCollection вы можете добавить большое изображение как поток, чтобы оно обрабатывалось как BLOB.

Этот C++‑код показывает, как добавить большое изображение через процесс BLOB:

const String pathToLargeImage = u"large_image.jpg";

// создает новую презентацию, в которую будет добавлено изображение.
auto pres = System::MakeObject<Presentation>();

auto fileStream = System::MakeObject<FileStream>(pathToLargeImage, FileMode::Open);
// Добавим изображение в презентацию — мы выбираем поведение KeepLocked, потому что мы
// НЕ планируем обращаться к файлу "largeImage.png" file.
auto img = pres->get_Images()->AddImage(fileStream, LoadingStreamBehavior::KeepLocked);
pres->get_Slides()->idx_get(0)->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 0.0f, 0.0f, 300.0f, 200.0f, img);

// Сохраняет презентацию. Пока выводится большая презентация, потребление памяти 
// остается низким на протяжении жизненного цикла объекта pres
pres->Save(u"presentationWithLargeImage.pptx", SaveFormat::Pptx);

Память и большие презентации

Обычно для загрузки большой презентации компьютерам требуется много временной памяти. Всё содержимое презентации загружается в память, и файл, из которого была загружена презентация, перестаёт использоваться.

Рассмотрим большую презентацию PowerPoint (large.pptx), содержащую видеофайл объёмом 1,5 ГБ. Стандартный метод загрузки презентации описан в этом C++‑коде:

auto pres = System::MakeObject<Presentation>(u"large.pptx");
pres->Save(u"large.pdf", SaveFormat::Pdf);

Но этот метод потребляет около 1,6 ГБ временной памяти.

Загрузка большой презентации как BLOB

Через процесс, использующий BLOB, можно загрузить большую презентацию, используя минимум памяти. Этот C++‑код описывает реализацию, где процесс BLOB используется для загрузки большого файла презентации (large.pptx):

auto blobManagementOptions = System::MakeObject<BlobManagementOptions>();
blobManagementOptions->set_PresentationLockingBehavior(PresentationLockingBehavior::KeepLocked);
blobManagementOptions->set_IsTemporaryFilesAllowed(true);

auto loadOptions = System::MakeObject<LoadOptions>();
loadOptions->set_BlobManagementOptions(blobManagementOptions);

auto pres = System::MakeObject<Presentation>(u"large.pptx", loadOptions);
pres->Save(u"large.pdf", SaveFormat::Pdf);

Изменение папки для временных файлов

При использовании процесса BLOB ваш компьютер создаёт временные файлы в папке по умолчанию для временных файлов. Если вы хотите, чтобы временные файлы хранились в другой папке, можно изменить настройки хранилища с помощью TempFilesRootPath:

auto blobManagementOptions = System::MakeObject<BlobManagementOptions>();
blobManagementOptions->set_PresentationLockingBehavior(PresentationLockingBehavior::KeepLocked);
blobManagementOptions->set_IsTemporaryFilesAllowed(true);
blobManagementOptions->set_TempFilesRootPath(u"temp");

auto loadOptions = System::MakeObject<LoadOptions>();
loadOptions->set_BlobManagementOptions(blobManagementOptions);

Освобождение объектов презентации для высвобождения памяти

При обработке больших презентаций убедитесь, что экземпляр Presentation правильно освобождается, чтобы освободить занятые им ресурсы памяти. Вызовите Dispose() после завершения работы с презентацией, чтобы освободить неуправляемые ресурсы.

auto presentation = System::MakeObject<Presentation>(u"large.pptx");

// ...обработать презентацию...
presentation->Save(u"large.pdf", SaveFormat::Pdf);

// Явно освобождаем ресурсы.
presentation->Dispose();

FAQ

Какие данные в презентации Aspose.Slides рассматриваются как BLOB и контролируются параметрами BLOB?

Большие двоичные объекты, такие как изображения, аудио и видео, рассматриваются как BLOB. Сам файл презентации также участвует в обработке BLOB при загрузке или сохранении. На эти объекты действуют политики BLOB, позволяющие управлять использованием памяти и записью во временные файлы при необходимости.

Где я могу настроить правила обработки BLOB при загрузке презентации?

Используйте LoadOptions с BlobManagementOptions. Там задаётся лимит памяти для BLOB, разрешение или запрет временных файлов, корневой путь для временных файлов и поведение блокировки источника.

Влияют ли параметры BLOB на производительность, и как сбалансировать скорость и память?

Да. Хранение BLOB в памяти максимизирует скорость, но увеличивает расход ОЗУ; снижение лимита памяти переносит часть работы во временные файлы, уменьшая ОЗУ за счёт дополнительного ввода‑вывода. Используйте метод set_MaxBlobsBytesInMemory для нахождения оптимального баланса под вашу нагрузку и окружение.

Помогают ли параметры BLOB при открытии крайне больших презентаций (например, гигабайтных)?

Да. BlobManagementOptions предназначены для таких сценариев: включение временных файлов и использование блокировки источника может значительно снизить пиковое потребление ОЗУ и стабилизировать обработку очень больших наборов слайдов.

Можно ли использовать политики BLOB при загрузке из потоков, а не из файлов на диске?

Да. Те же правила применяются к потокам: экземпляр презентации может владеть и блокировать входной поток (в зависимости от выбранного режима блокировки), а временные файлы используются, если это разрешено, что обеспечивает предсказуемое потребление памяти во время обработки.