請教大佬,怎么將這幾十萬個圖片都進行壓縮處理(每個圖片單個壓縮處理),代碼怎么寫處理最快?
uj5u.com熱心網友回復:
好像只能遍歷?不然就多執行緒遍歷?uj5u.com熱心網友回復:
這個建議你用生產者消費者模式自建一個佇列慢慢處理,可以看看我的這片文章https://blog.csdn.net/dotnetstudio/article/details/106960856
uj5u.com熱心網友回復:
做個程式,慢慢做uj5u.com熱心網友回復:
將圖片按規則分組,并發處理就好了,要不了多少時間uj5u.com熱心網友回復:
一張一張壓縮。。。。uj5u.com熱心網友回復:
因為壓縮任務是CPU密集型的任務,正好適用多執行緒技術。1. 需要1個阻塞佇列(要設定最大值,能夠阻塞執行緒才行,可以控制記憶體不會溢位)。
2. 需要1個執行緒,用于讀取圖片。
3. 需要1個執行緒組(執行緒組的執行緒數與CPU的可用核心數一致),用于壓縮圖片。
上述的阻塞佇列,就是 1,2 兩個環節的資料通道,1環節是IO密集型作業,如果有必要,可以采用NIO。
任務完畢,如何自動停止執行緒?
由于使用了阻塞佇列,控制執行緒的自然停止就會不太方便,這里推薦使用“致命毒藥”將執行緒毒死即可。
我們定義一個全域型的能夠放入阻塞佇列的物件,讓她成為致命毒藥,上述建立的所有執行緒,只要處理到這個物件之后,立即退出執行緒即可。
生產者執行緒在所有圖片都放入阻塞佇列之后,將毒藥物件也放入阻塞佇列,這會造成后面的執行緒組被毒死。執行緒組有幾個執行緒,就放幾次毒藥。
uj5u.com熱心網友回復:
再來談談圖片的壓縮。通常情況下,JPEG型的圖片,已經沒有什么壓縮的必要了,估計也就是圖片的等比縮放以及裁切吧。
這些圖片,要想進行等比縮放和裁切,就必須將圖片的每個像素點的內容都保存到記憶體中才能進行操作。
(也就是說,大圖片用Java來處理時,多執行緒會占用大量記憶體,小心記憶體溢位的問題。)
uj5u.com熱心網友回復:
遍歷一下,一張一張處理就完事了。雖然通過并發處理可能能夠有一點優化空間,畢竟壓縮本身是需要占用大量cpu的。但是程式優化的再好,也抵不過硬碟拖后腿,所以優化的效果估計不會太大。
另外這個也與你的硬碟有關,如果你是一個磁盤陣列,資料本身是分布在不同的磁盤上,則使用并發處理應該會對性能有很大的提高作用。或者是ssd貌似也是可以支持多通道并發處理的。如果是傳統磁盤,受機械尋道限制,并發處理也許會讓效果更差。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11231.html
標籤:Java相關
上一篇:eclipse自動換行
