我有一个允许文件上传的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