目標創建過程郵編與大ZIP包節點高速
我們站在了一個低容積網站,在這裏用戶(瀏覽器客戶端)就可以選擇圖像文件(每個文件284 KB),然後請求節點快車服務器將它們捆綁到一個ZIP下載到Web客戶端。
問題&設計約束
- 得到的ZIP可能是50 MB的順序 - 5 GB。因此,我們希望 在構建ZIP爲 的同時爲用戶提供運行進度條。 (我們假設瀏覽器會給出正在運行的更新,以實際下載的進度爲 )。
- 雖然我們預計請求數量很少 (1-2次請求)。但是,我們不想完全捆綁我們的核心服務器處理器,所以我們希望最小化捆綁快速服務器的同步呼叫。
- 鑑於ZIP的大小,我們不能指望郵編僅在內存中組裝
- 有沒有其他問題我們應該擔心?
問題
我們假設運行7zip的一個子進程是不好的,因爲我們不會得到至於多少的258KB的文件已經被添加到ZIP任何運行狀態。
考慮到上面列出的設計約束/目標,下列哪些軟件包是非常適合Node/ExpressJS的軟件包?
- 歸檔:https://www.npmjs.com/package/archiver
- jszip:https://www.npmjs.com/package/jszip
- easyzip:https://www.npmjs.com/package/easy-zip
- expresszip:https://www.npmjs.com/package/express-zip
- zipstream:https://www.npmjs.com/package/zip-stream
什麼我上面看到的是,大多數的包先收集文件,然後將它們最終確定到內存然後管他們到http請求(可能對5GB數據不好或我錯過了什麼)。有些似乎能夠使用磁盤,但問題是每個文件都添加後會有更新事件嗎?
其他人似乎完全異步,我不知道如何將每個文件添加到ZIP包時獲得正在運行的進度值。
我認爲最簡單的設計是運行一個子進程,它將生成的zip文件放在磁盤上的臨時文件中,並管理它自己的內存消耗。然後,當這些完成時,您可以從下載的磁盤流臨時文件。然後,你需要的只是一個可執行文件,它將壓縮文件構建到標準輸出提供了一些進展。由於它在另一個進程中運行,因此不必擔心它如何以處理器方式執行其工作,因爲它不會以任何方式捆綁nodej。就其性質而言,壓縮有點CPU密集型,所以你不能真正避免這種情況。 – jfriend00
@ jfriend00我在目標計算機上提供的所有內容都是7zip,當我嘗試使用--bb日誌記錄開關時,只會在歸檔完成後打印出文件。也許我錯過了一個開關? https://sevenzip.osdn.jp/chm/cmdline/switches/index.htm –