![以最快的方式归档一堆文件](https://linux22.com/image/668862/%E4%BB%A5%E6%9C%80%E5%BF%AB%E7%9A%84%E6%96%B9%E5%BC%8F%E5%BD%92%E6%A1%A3%E4%B8%80%E5%A0%86%E6%96%87%E4%BB%B6.png)
我正在实现一个 torrent 下载和存档系统。我想下载一个 torrent 文件(其中包含几个小文件)然后将其存档。我的磁盘性能很差。所以我想要一种高效的文件存档方法。
我有几种选择:
1.在普通磁盘/文件系统上下载文件,然后使用普通 unixtar
命令对其进行 TAR。
2.创建空白的 TAR 存档,然后使用 以写入模式挂载它archivemount
,然后开始在挂载的路径中下载 torrent。
3.类似于选项2但使用 ZIP 文件而不是 tar。
4.因为我想通过 Web 浏览器传递文件:实现一个软件/脚本来动态地将文件夹打包成 TAR。(几年前我写了一个 Python 脚本(uWsgi/Nginx)来做这件事。但是由于 tar 需要对每个文件进行校验,所以性能很差)
5.找到一个可以直接写入 TAR/Zip 文件的 torrent 客户端。(可能性很小)
我该考虑哪种方式?
谢谢。
答案1
如果磁盘确实是您的真正瓶颈,那么性能最佳的可能仍然是 4。这样您就不必花费宝贵的 IOPS 将文件从一个地方复制到另一个地方。
此外,选项 4 实际上是允许客户端在服务器下载完成后立即下载 torrent 的唯一选项,这意味着客户端实际上可以更快地获取其数据。此外,通过这种方式,您可以选择轻松允许用户下载单个文件(非常简单,因为它们只是放在您的文件系统上)。
我会调查为什么 tar 的性能如此糟糕。我真的怀疑你的问题出在校验和上,因为据我所知,校验和甚至不在数据上。有什么原因你不能直接将 GNU tar 的输出通过管道传输到 Web 浏览器,而不是编写自己的 tar 打包程序?
一个挑战是使用这种方法向客户端提供正确的内容长度。如果您不关心这一点,您可以忽略发送此信息,那么您的客户端就不会看到下载的百分比计数器。这可能并不重要,具体取决于您的应用程序。