2011-05-04 52 views
2

我們使用PHP和CodeIgniter從數百個源中導入數百萬個圖像,在本地調整大小,然後將大小調整後的版本上傳到Amazon S3。然而,這個過程需要比預期更長的時間,我們正在尋找替代品來加快速度。欲瞭解更多詳情:將數百萬張圖像導入,調整大小並上傳到Amazon S3

  • 查找是在我們的MySQL數據庫表中對尚未調整大小的圖像進行的。結果是一組圖像。
  • 每個圖像都使用cURL單獨導入,並在處理期間臨時託管在我們的服務器上。它們是本地導入的,因爲該庫不允許調整大小/裁剪外部圖像。根據一些測試,從不同外部輸入源輸入時的速度差異一直在80-140秒之間(對於整個過程,每次測試使用200個圖像),所以外部源可以明顯減慢速度。
  • 當前的圖像是使用image_moo library,它可以創建一個CodeIgniter S3 library
  • 的S3網址爲新調整大小圖像的圖像
  • 調整後的圖像上傳到Amazon S3的副本,然後保存在數據庫調整表,之後開始下一個圖像

該過程每個圖像需要0.5-1秒,這意味着所有當前圖像將需要一個月的時間來調整大小並上傳到S3。這個問題的主要問題是我們不斷增加圖像的新來源,並預計在2011年底之前至少有3000萬到5000萬的圖像,而目前的5月初的400萬。

我注意到了StackOverflow中的一個答案,它可能是我們的解決方案的一個很好的補充,其中圖像是resized and uploaded on the fly,但由於我們不希望人們訪問頁面時出現任何不必要的延遲,因此我們需要確保儘可能多的圖像儘可能已經上傳。除此之外,我們需要多種尺寸的圖像格式,目前只能上傳最重要的格式,因爲這個速度問題。理想情況下,每個導入的圖像至少要有三種尺寸格式(例如,一個縮略圖,一個正常尺寸和一個大尺寸)。

有人建議幾天前批量上傳到S3--任何這種節省的經驗都會有幫助。

如果您有類似流程的經驗,回答問題的任何部分將會有所幫助。部分代碼(簡體)

$newpic=$picloc.'-'.$width.'x'.$height.'.jpg'; 
$pic = $this->image_moo 
     ->load($picloc.'.jpg') 
    ->resize($width,$height,TRUE) 
    ->save($newpic,'jpg'); 
if ($this->image_moo->errors) { 
    // Do stuff if something goes wrong, for example if image no longer exists - this doesn't happen very often so is not a great concern 
} 
else { 
     if (S3::putObject(
     S3::inputFile($newpic), 
     'someplace', 
     str_replace('./upload/','', $newpic), 
     S3::ACL_PUBLIC_READ, 
     array(), 
     array( 
     "Content-Type" => "image/jpeg", 
    ))) 
{ // save URL to resized image in database, unlink files etc, then start next image 
+0

您可以通過Etsy在批量處理數百萬張圖像方面的經驗來學習。請參閱:https://codeascraft.com/2010/07/09/batch-processing-millions-of-images/ – EdgeCaseBerg 2015-07-01 15:53:14

回答

3

爲什麼沒有在服務器上添加一些包裝邏輯,可以讓你定義範圍或圖像組,然後運行該腳本幾次。如果你可以在不同的圖像集上同時運行其中的四個進程,那麼它將以四倍的速度完成!

如果您在試圖通過一個非常大的積壓項目時遇到困難,那麼您可以考慮啓動一些Amazon EC2實例並使用它們進一步並行化流程。

+1

我同意。必須有某種方法來分解可以並行處理的問題。 EC2實例似乎是一個堅實的想法。某種地圖/縮小型概念將在此處起作用。 – 2011-05-04 16:58:48

1

我建議你將你的腳本分成兩個併發運行的腳本。人們可以將遠程圖像提取到本地源,只需對尚未在本地處理或緩存的任何/所有圖像執行此操作即可。由於遠程數據源會爲請求添加一點點延遲,因此您將不斷獲取遠程圖像,而不僅僅是在處理每一個圖像時都會這樣做。

同時您使用第二個腳本來調整任何本地緩存的圖像的大小並將其上傳到Amazon S3。或者,您也可以使用一個腳本來調整本地文件的大小,然後再將另一個調整大小的文件上傳到S3。

第一部分(獲取遠程源圖像)將大大受益於運行多個併發實例,如James C上述建議。