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

ภาพรวม

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

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

เกี่ยวกับ BLOB

BLOB (Binary Large Object) มักหมายถึงรายการขนาดใหญ่ (ภาพถ่าย, งานนำเสนอ, เอกสาร หรือสื่อ) ที่บันทึกในรูปแบบไบนารี

Aspose.Slides for PHP via Java ให้คุณใช้ BLOB สำหรับวัตถุในลักษณะที่ลดการใช้หน่วยความจำเมื่อไฟล์ขนาดใหญ่มีส่วนเกี่ยวข้อง

ใช้ BLOB เพื่อลดการใช้หน่วยความจำ

เพิ่มไฟล์ขนาดใหญ่ผ่าน BLOB ลงในงานนำเสนอ

Aspose.Slides for Java ให้คุณเพิ่มไฟล์ขนาดใหญ่ (ในกรณีนี้คือไฟล์วิดีโอขนาดใหญ่) ผ่านกระบวนการที่ใช้ BLOB เพื่อลดการใช้หน่วยความจำ

โค้ด Java นี้จะแสดงวิธีเพิ่มไฟล์วิดีโอขนาดใหญ่ผ่านกระบวนการ BLOB ลงในงานนำเสนอ:

  $pathToVeryLargeVideo = "veryLargeVideo.avi";
  # สร้างงานนำเสนอใหม่ที่วิดีโอจะถูกเพิ่มเข้าไป
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToVeryLargeVideo);
    try {
      # เพิ่มวิดีโอลงในงานนำเสนอ - เราเลือกพฤติกรรม KeepLocked เนื่องจากเราไม่ตั้งใจเข้าถึงไฟล์ "veryLargeVideo.avi"
      $video = $pres->getVideos()->addVideo($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addVideoFrame(0, 0, 480, 270, $video);
      # บันทึกงานนำเสนอ ในขณะที่งานนำเสนอขนาดใหญ่กำลังถูกสร้าง การใช้หน่วยความจำจะคงที่ต่ำตลอดวงจรชีวิตของวัตถุ 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();
    }
  }

ส่งออกไฟล์ขนาดใหญ่ผ่าน BLOB จากงานนำเสนอ

Aspose.Slides for PHP via Java ให้คุณส่งออกไฟล์ขนาดใหญ่ (เช่นไฟล์เสียงหรือวิดีโอ) ผ่านกระบวนการที่ใช้ BLOB จากงานนำเสนอ ตัวอย่างเช่น คุณอาจต้องการสกัดไฟล์สื่อขนาดใหญ่จากงานนำเสนอแต่ไม่ต้องการให้ไฟล์ถูกโหลดเข้าสู่หน่วยความจำของคอมพิวเตอร์โดยตรง การส่งออกไฟล์ผ่านกระบวนการ BLOB จะทำให้การใช้หน่วยความจำต่ำลง

โค้ดต่อไปนี้แสดงการดำเนินการที่อธิบายไว้:

  $hugePresentationWithAudiosAndVideosFile = "LargeVideoFileTest.pptx";
  $loadOptions = new LoadOptions();
  # ล็อกไฟล์ต้นทางและไม่โหลดเข้าไปในหน่วยความจำ
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  # สร้างอินสแตนซ์ Presentation และล็อกไฟล์ "hugePresentationWithAudiosAndVideos.pptx"
  $pres = new Presentation($hugePresentationWithAudiosAndVideosFile, $loadOptions);
  try {
    # ให้บันทึกวิดีโอแต่ละไฟล์ลงในไฟล์ เพื่อป้องกันการใช้หน่วยความจำมากเกินไป เราต้องมีบัฟเฟอร์ที่จะใช้
    # เพื่อถ่ายโอนข้อมูลจากสตรีมวิดีโอของงานนำเสนอไปยังสตรีมของไฟล์วิดีโอที่สร้างใหม่
    $Array = new JavaClass("java.lang.reflect.Array");
    $Byte = new JavaClass("java.lang.Byte");
    $buffer = $Array->newInstance($Byte, 8 * 1024);
    # วนรอบผ่านวิดีโอทั้งหมด
    for($index = 0; $index < java_values($pres->getVideos()->size()) ; $index++) {
      $video = $pres->getVideos()->get_Item($index);
      # เปิดสตรีมวิดีโอของงานนำเสนอ โปรดทราบว่าเราตั้งใจหลีกเลี่ยงการเข้าถึงคุณลักษณะ
      # เช่น video.BinaryData - เนื่องจากคุณลักษณะนี้คืนค่ารายการไบต์ที่มีวิดีโอเต็ม ซึ่ง
      # ทำให้ไบต์ถูกโหลดเข้าในหน่วยความจำ เราใช้ video.GetStream ซึ่งจะคืนค่าเป็น Stream - และไม่
      # ต้องโหลดวิดีโอทั้งหมดเข้าสู่หน่วยความจำ
      $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();
      }
      # การใช้หน่วยความจำจะคงต่ำไม่ว่าไฟล์วิดีโอหรือการนำเสนอจะมีขนาดเท่าใด
    }
    # หากจำเป็น คุณสามารถทำตามขั้นตอนเดียวกันสำหรับไฟล์เสียงได้
  } catch (JavaException $e) {
  } finally {
    $pres->dispose();
  }

เพิ่มรูปภาพเป็น BLOB ลงในงานนำเสนอ

ด้วยเมธอดจากคลาส ImageCollection คุณสามารถเพิ่มรูปภาพขนาดใหญ่เป็นสตรีมเพื่อให้ถือเป็น BLOB

โค้ด PHP นี้จะแสดงวิธีเพิ่มรูปภาพขนาดใหญ่ผ่านกระบวนการ BLOB:

  $pathToLargeImage = "large_image.jpg";
  # สร้างงานนำเสนอใหม่ที่ภาพจะถูกเพิ่มเข้าไป.
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToLargeImage);
    try {
      # เราจะเพิ่มภาพลงในงานนำเสนอ - เราเลือกพฤติกรรม KeepLocked เนื่องจากเรา
      # ไม่ได้ตั้งใจเข้าถึงไฟล์ "largeImage.png" .
      $img = $pres->getImages()->addImage($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, 300, 200, $img);
      # บันทึกงานนำเสนอ ในขณะที่งานนำเสนอขนาดใหญ่กำลังถูกสร้าง การใช้หน่วยความจำ
      # จะคงต่ำตลอดอายุการทำงานของวัตถุ 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();
    }
  }

หน่วยความจำและงานนำเสนอขนาดใหญ่

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

พิจารณางานนำเสนอ PowerPoint ขนาดใหญ่ (large.pptx) ที่มีไฟล์วิดีโอขนาด 1.5 GB วิธีมาตรฐานในการโหลดงานนำเสนอแสดงในโค้ด PHP นี้:

  $pres = new Presentation("large.pptx");
  try {
    $pres->save("large.pdf", SaveFormat::Pdf);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

แต่วิธีนี้ใช้หน่วยความจำชั่วคราวประมาณ 1.6 GB

โหลดงานนำเสนอขนาดใหญ่เป็น BLOB

ผ่านกระบวนการที่ใช้ BLOB คุณสามารถโหลดงานนำเสนอขนาดใหญ่โดยใช้หน่วยความจำน้อย โค้ด PHP นี้อธิบายการนำ BLOB มาใช้ในการโหลดไฟล์งานนำเสนอขนาดใหญ่ (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();
    }
  }

เปลี่ยนโฟลเดอร์สำหรับไฟล์ชั่วคราว

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

  $loadOptions = new LoadOptions();
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  $loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
  $loadOptions->getBlobManagementOptions()->setTempFilesRootPath("temp");

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

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

$presentation = new Presentation("large.pptx");

# ...ประมวลผลงานนำเสนอ...
$presentation->save("large.pdf", SaveFormat::Pdf);

# ปล่อยทรัพยากรโดยชัดเจน.
$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 เมื่อโหลดจากสตรีมแทนไฟล์ดิสก์ได้หรือไม่?

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