2017-05-23 58 views
0

目標創建過程郵編與大ZIP包節點高速

我們站在了一個低容積網站,在這裏用戶(瀏覽器客戶端)就可以選擇圖像文件(每個文件284 KB),然後請求節點快車服務器將它們捆綁到一個ZIP下載到Web客戶端。

問題&設計約束

  • 得到的ZIP可能是50 MB的順序 - 5 GB。因此,我們希望 在構建ZIP爲 的同時爲用戶提供運行進度條。 (我們假設瀏覽器會給出正在運行的更新,以實際下載的進度爲 )。
  • 雖然我們預計請求數量很少 (1-2次請求)。但是,我們不想完全捆綁我們的核心服務器處理器,所以我們希望最小化捆綁快速服務器的同步呼叫。
  • 鑑於ZIP的大小,我們不能指望郵編僅在內存中組裝
  • 有沒有其他問題我們應該擔心?

問題

我們假設運行7zip的一個子進程是不好的,因爲我們不會得到至於多少的258KB的文件已經被添加到ZIP任何運行狀態。

考慮到上面列出的設計約束/目標,下列哪些軟件包是非常適合Node/ExpressJS的軟件包?

什麼我上面看到的是,大多數的包先收集文件,然後將它們最終確定到內存然後管他們到http請求(可能對5GB數據不好或我錯過了什麼)。有些似乎能夠使用磁盤,但問題是每個文件都添加後會有更新事件嗎?

其他人似乎完全異步,我不知道如何將每個文件添加到ZIP包時獲得正在運行的進度值。

+0

我認爲最簡單的設計是運行一個子進程,它將生成的zip文件放在磁盤上的臨時文件中,並管理它自己的內存消耗。然後,當這些完成時,您可以從下載的磁盤流臨時文件。然後,你需要的只是一個可執行文件,它將壓縮文件構建到標準輸出提供了一些進展。由於它在另一個進程中運行,因此不必擔心它如何以處理器方式執行其工作,因爲它不會以任何方式捆綁nodej。就其性質而言,壓縮有點CPU密集型,所以你不能真正避免這種情況。 – jfriend00

+0

@ jfriend00我在目標計算機上提供的所有內容都是7zip,當我嘗試使用--bb日誌記錄開關時,只會在歸檔完成後打印出文件。也許我錯過了一個開關? https://sevenzip.osdn.jp/chm/cmdline/switches/index.htm –

回答

0

上面列出的軟件包。大多數人是不恰當的

  • JSZIP主要是針對瀏覽器
  • EasyZip是JSZIP的節點包裝,但它不提供 進度通知durring創作
  • 快遞-Zip是一個內存快遞(但是 可能不會處理我們正在談論的ZIP的大小)
    • ZIP-Stream是基礎實用程序的基礎下的Archiver。歸檔具有 排隊服務,所以一個應該只是用戶歸檔
  • YAZL可能會奏效,但界面是不是歸檔
  • 進步 跟蹤

我們選擇歸檔更爲複雜,因爲它有最功能所需的:

  • 快遞場所
  • 低內存佔用
  • 與我們創建的特定圖像檔案一樣快(7ZIP)(我們不需要壓縮,文件很大等)。您可能在其他類型的檔案中的性能提高25%
  • 它不會讓您追加到現有的檔案(這是我們想要的一個功能),但adm-zip可能會提供該差距

至於7zip解決方案。我們傾向於不喜歡從產生的子進程讀取標準輸出流的內容。

  • 這是凌亂找到字符串的詮釋,他流
  • 它會導致上下文切換到讀取流,
  • 你有一個脆弱的解決方案試圖解決什麼輸出流推出(例如,在的情況下, 7zip它有時會以30%的跳躍率跳出1%),以及其他脆弱解決方案的來源。
+0

真正取決於服務器性能配置文件的一個問題是,看起來node-archiver正在運行中。如果你正在做很多這樣的事情或者一次爲很多用戶提供服務,你可能真的從檔案處理過程中受益(如在另一個過程中運行7zip)。而且,在負載情況下,這將提供更多的可擴展性優勢,比從一個進程到另一個進程的標準輸出的額外成本更高。處理解析輸出流是一個純粹可以解決的問題(這只是完全理解它並編寫代碼來處理它的問題)。 – jfriend00

+0

因此,選擇node-archiver爲您提供的進度界面當然沒有問題,但要注意它是否滿足您的可伸縮性需求。你用7zip提到的問題是完全可以解決的。需要編寫更多的代碼,但如果您希望在問題中投擲更多CPU或從快速進程中卸載zip處理以釋放它以便更好地處理其他Web請求,則可以解決問題。 – jfriend00

+0

我的帖子中的第一行是這樣寫的:「我們站在一個低容量的站點上,」所以不,擴展到許多併發用戶不是體系結構或問題空間的一部分。 –

0

我們假設將7zip作爲子進程運行是不好的,因爲我們無法獲得任何運行狀態,因爲有多少258KB文件已經添加到ZIP中。

這似乎是一個錯誤的假設。

像這樣的命令行會顯示添加到存檔stdout上的每個文件進度每個新文件增加是:

7z a -bsp1 -bb3 test.7z * 

所以,你可以啓動,從使用子進程模塊的node.js並且您應該能夠捕獲標準輸出進度。您將需要使用spawn,而不是exec,因此您可以將stdout數據正常運行。

將此作爲子進程運行將使您的nodejs進程免費爲其他請求提供服務,並允許子進程獨立於nodejs管理其自己的內存。

7zip程序可處理非常大的檔案和文件,並具有適當的內存使用量。使用正確的標誌來獲得stdout的進展並將其作爲子進程運行,似乎滿足您的所有需求。

+0

謝謝@jfriend。我有時間做我自己的研發。這兩種方法都有優點和缺點。使用磁盤來分級數據(並且可以處理64位zip容器)的NPM軟件包使用節點Zlib https://nodejs.org/api/zlib.html,這可以節省大量的流程上下文,以7zip spawn方式進行交換。我將測試7zip和archiver(它有很好的進度監控)並報告回來。 –

+0

順便說一下,-bb3或者只是-bb1沒有幫助,如上所述,它不顯示進度。這裏是我用於7zip -a -tzip -mx1 -mmt- = on -r -bsp1 –

+0

哦,是的,我不認爲7zip可以做增量進度的原因是:https://superuser.com/questions/702122/how-to-show-extraction-progress-of-7zip-inside-cmd –