Управление BLOB

О BLOB

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

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

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

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

Aspose.Slides для 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 для 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);

// Создаёт экземпляр презентации, блокирует файл "hugePresentationWithAudiosAndVideos.pptx".

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

// Итерирует по видео
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".
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);