免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

將20M文件從30秒壓縮到1秒,我是如何做到的?

:2019年11月11日 IT牧場
分享到:

有一個需求需要將前端傳過來的10張照片,然后后端進行處理以后壓縮成一個壓縮包通過網(wǎng)絡流傳輸出去。之前沒有接觸過用Java壓縮文件的,所以就直接上網(wǎng)找了一個例子改了一下用了,改完以后也能使用,但是...

壓縮20M文件從30秒到1秒的優(yōu)化過程

有一個需求需要將前端傳過來的10張照片,然后后端進行處理以后壓縮成一個壓縮包通過網(wǎng)絡流傳輸出去。之前沒有接觸過用Java壓縮文件的,所以就直接上網(wǎng)找了一個例子改了一下用了,改完以后也能使用,但是隨著前端所傳圖片的大小越來越大的時候,耗費的時間也在急劇增加,最后測了一下壓縮20M的文件竟然需要30秒的時間。壓縮文件的代碼如下。

這里找了一張2M大小的圖片,并且循環(huán)十次進行測試。打印的結果如下,時間大概是30秒。

第一次優(yōu)化過程-從30秒到2秒

進行優(yōu)化首先想到的是利用緩沖區(qū)**BufferInputStream。在FileInputStreamread()**方法每次只讀取一個字節(jié)。源碼中也有說明。

這是一個調用本地方法與原生操作系統(tǒng)進行交互,從磁盤中讀取數(shù)據(jù)。每讀取一個字節(jié)的數(shù)據(jù)就調用一次本地方法與操作系統(tǒng)交互,是非常耗時的。例如我們現(xiàn)在有30000個字節(jié)的數(shù)據(jù),如果使用FileInputStream那么就需要調用30000次的本地方法來獲取這些數(shù)據(jù),而如果使用緩沖區(qū)的話(這里假設初始的緩沖區(qū)大小足夠放下30000字節(jié)的數(shù)據(jù))那么只需要調用一次就行。因為緩沖區(qū)在第一次調用read()方法的時候會直接從磁盤中將數(shù)據(jù)直接讀取到內存中。隨后再一個字節(jié)一個字節(jié)的慢慢返回。

BufferedInputStream內部封裝了一個byte數(shù)組用于存放數(shù)據(jù),默認大小是8192

優(yōu)化過后的代碼如下

輸出

可以看到相比較于第一次使用FileInputStream效率已經(jīng)提升了許多了

第二次優(yōu)化過程-從2秒到1秒

使用緩沖區(qū)buffer的話已經(jīng)是滿足了我的需求了,但是秉著學以致用的想法,就想著用NIO中知識進行優(yōu)化一下。

使用Channel

為什么要用Channel呢?因為在NIO中新出了ChannelByteBuffer。正是因為它們的結構更加符合操作系統(tǒng)執(zhí)行I/O的方式,所以其速度相比較于傳統(tǒng)IO而言速度有了顯著的提高。Channel就像一個包含著煤礦的礦藏,而ByteBuffer則是派送到礦藏的卡車。也就是說我們與數(shù)據(jù)的交互都是與ByteBuffer的交互。

在NIO中能夠產(chǎn)生FileChannel的有三個類。分別是FileInputStream、FileOutputStream、以及既能讀又能寫的RandomAccessFile

源碼如下

我們可以看到這里并沒有使用ByteBuffer進行數(shù)據(jù)傳輸,而是使用了transferTo的方法。這個方法是將兩個通道進行直連。

這是源碼上的描述文字,大概意思就是使用transferTo的效率比循環(huán)一個Channel讀取出來然后再循環(huán)寫入另一個Channel好。操作系統(tǒng)能夠直接傳輸字節(jié)從文件系統(tǒng)緩存到目標的Channel中,而不需要實際的copy階段。

copy階段就是從內核空間轉到用戶空間的一個過程

可以看到速度相比較使用緩沖區(qū)已經(jīng)有了一些的提高。

內核空間和用戶空間

那么為什么從內核空間轉向用戶空間這段過程會慢呢?首先我們需了解的是什么是內核空間和用戶空間。在常用的操作系統(tǒng)中為了保護系統(tǒng)中的核心資源,于是將系統(tǒng)設計為四個區(qū)域,越往里權限越大,所以Ring0被稱之為內核空間,用來訪問一些關鍵性的資源。Ring3被稱之為用戶空間。

用戶態(tài)、內核態(tài):線程處于內核空間稱之為內核態(tài),線程處于用戶空間屬于用戶態(tài)

那么我們如果此時應用程序(應用程序是都屬于用戶態(tài)的)需要訪問核心資源怎么辦呢?那就需要調用內核中所暴露出的接口用以調用,稱之為系統(tǒng)調用。例如此時我們應用程序需要訪問磁盤上的文件。此時應用程序就會調用系統(tǒng)調用的接口open方法,然后內核去訪問磁盤中的文件,將文件內容返回給應用程序。大致的流程如下

直接緩沖區(qū)和非直接緩沖區(qū)

既然我們要讀取一個磁盤的文件,要廢這么大的周折。有沒有什么簡單的方法能夠使我們的應用直接操作磁盤文件,不需要內核進行中轉呢?有,那就是建立直接緩沖區(qū)了。

非直接緩沖區(qū):非直接緩沖區(qū)就是我們上面所講內核態(tài)作為中間人,每次都需要內核在中間作為中轉。

直接緩沖區(qū):直接緩沖區(qū)不需要內核空間作為中轉copy數(shù)據(jù),而是直接在物理內存申請一塊空間,這塊空間映射到內核地址空間和用戶地址空間,應用程序與磁盤之間數(shù)據(jù)的存取通過這塊直接申請的物理內存進行交互。

既然直接緩沖區(qū)那么快,我們?yōu)槭裁床欢加弥苯泳彌_區(qū)呢?其實直接緩沖區(qū)有以下的缺點。直接緩沖區(qū)的缺點:

  • 不安全

  • 消耗更多,因為它不是在JVM中直接開辟空間。這部分內存的回收只能依賴于垃圾回收機制,垃圾什么時候回收不受我們控制。

  • 數(shù)據(jù)寫入物理內存緩沖區(qū)中,程序就喪失了對這些數(shù)據(jù)的管理,即什么時候這些數(shù)據(jù)被最終寫入從磁盤只能由操作系統(tǒng)來決定,應用程序無法再干涉。

綜上所述,所以我們使用transferTo方法就是直接開辟了一段直接緩沖區(qū)。所以性能相比而言提高了許多

使用內存映射文件

NIO中新出的另一個特性就是內存映射文件,內存映射文件為什么速度快呢?其實原因和上面所講的一樣,也是在內存中開辟了一段直接緩沖區(qū)。與數(shù)據(jù)直接作交互。源碼如下

打印如下

可以看到速度和使用Channel的速度差不多的。

使用Pipe

Java NIO 管道是2個線程之間的單向數(shù)據(jù)連接。Pipe有一個source通道和一個sink通道。其中source通道用于讀取數(shù)據(jù),sink通道用于寫入數(shù)據(jù)??梢钥吹皆创a中的介紹,大概意思就是寫入線程會阻塞至有讀線程從通道中讀取數(shù)據(jù)。如果沒有數(shù)據(jù)可讀,讀線程也會阻塞至寫線程寫入數(shù)據(jù)。直至通道關閉。

Whether or not a thread writing bytes to a pipe will block until another thread reads those bytes

我想要的效果是這樣的。源碼如下:

源碼地址:https://github.com/modouxiansheng/Doraemon

總結

生活處處都需要學習,有時候只是一個簡單的優(yōu)化,可以讓你深入學習到各種不同的知識。所以在學習中要不求甚解,不僅要知道這個知識也要了解為什么要這么做。

[我要糾錯]
[ 編輯:宋聰喬 &發(fā)表于江蘇 ]
關鍵詞: 壓縮 文件 30秒 優(yōu)化 過程

來源:本文內容搜集或轉自各大網(wǎng)絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發(fā)布,請聯(lián)系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。

點個贊
0
踩一腳
0

您在閱讀:將20M文件從30秒壓縮到1秒,我是如何做到的?

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺保留所有權利

蘇公網(wǎng)安備32010402000125 蘇ICP備14051488號-3技術支持:南京博盛藍睿網(wǎng)絡科技有限公司

南京思必達教育科技有限公司版權所有   百度統(tǒng)計

主站蜘蛛池模板: 亚洲第一成年网站大全亚洲 | 老湿影院在线免费观看 | 亚洲成人免费看 | 日韩伦理网在线视频 | 一级片黄色一级片 | 一级一级一级毛片免费毛片 | 亚洲国产精品久久久天堂 | 欧美精品一级 | 特级黄a三级三级三级 | 精品欧美在线观看 | 午夜影院三级 | 91香蕉污 | 在线黄| 成人短视频在线 | 国产大片免费观看中文字幕 | 毛片段| 伊人欧美 | 天堂中文字幕 | yy6080理aa级伦大片一级 | 一级毛片成人免费看a | 亚洲免费精品视频 | 波多野结衣与老人公gvg在线 | 免费国产成人手机在线观看 | 91国内在线国内在线播放 | 曰本女人色黄网站 | 在线免费观看亚洲 | 黄色的视频免费观看 | 免费看欧美一级特黄a大片一 | 春水堂污 | 无遮挡高清一级毛片免费 | 中文字幕亚洲综合精品一区 | 免费在线观看的黄色网址 | 香蕉视频404 | 一区二区三区四区在线观看视频 | 久久久免费观看 | 国产精品欧美日韩精品 | 特黄特色一级aa毛片免费观看 | 波多野结衣一区二区三区在线观看 | 免费人成又黄又爽的视频强 | 日韩国产精品欧美一区二区 | 日韩在线一区二区三区免费视频 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產(chǎn)品享最低成本,有需要聯(lián)系,
  • 卡爾蔡司鏡片優(yōu)惠店,鏡片價格低
  • 蘋果原裝手機殼