我有一個允許文件上傳的Yesod應用程序(但問題比這個更普遍)。我也允許文件dowloads。我想讓用戶用單個鏈接下載多個文件。根據這個問題:How to download multiple files with one HTTP request?唯一的解決方案似乎是創建文件存檔與所有的文件裏面。在Web服務器上動態創建流式文件存檔
我想在Haskell的常量內存中使用Hackage的庫來完成它,而不寫入磁盤或執行外部程序。
尤其是以下的非解決方案:
調用外部程序創建存檔:該文件可能是在磁盤或通過一些偏遠的網址上訪問某些數據庫。該文件系統可能是「只讀」的。由於安全原因,執行外部程序可能不可能。外部程序使部署複雜化。
從源文件在磁盤上創建臨時存檔:請參閱上面的「只讀」文件系統。實際上寫入磁盤的效率也非常低。
在內存中創建完整的存檔並在之後進行提供:文件可能非常大(可能是CD映像)和多個文件。需要的內存太大了。
如果您在內存中執行此操作,並且有10個用戶每個都下載5x 100MB文件,則您需要5GB的RAM才能進行歸檔。似乎沒有特別的可擴展性。 – Polynomial
@Polynomial,如果你閱讀這個問題,@Tener明確不想將整個檔案保存在內存中。有很多'gzip'和'zip'的實現可以實時壓縮內容並對其進行流式處理。 – dflemstr
@dflemstr哎呀,錯過了問題的最後部分。儘管如此,這似乎是在即使是中等負載的情況下也會摧毀服務器的CPU。 – Polynomial