多线程分段下载文件时,为什么不下载到同一个大文件中?而是要分别下载到单独的文件然后再合并。

207 天前
 lsk569937453

https://gist.github.com/lsk569937453/e0496754cf3ebe740a33a7759516015e

我自己写了个 demo ,假设开 50 个线程下载,每个线程下载时间为 10s 钟,可以看到最后写入文件的时间才 1s 不到。

所以下载文件时,瓶颈是网络 IO 吧,操作文件 IO 的时间可以忽略不计了。所以是不是下载到一个文件中更优?

11620 次点击
所在节点    程序员
103 条回复
monkeyWie
207 天前
@augustheart #60 是有的,但是要手动开起来,而且并不怎么好用
lieh222
207 天前
可能为了兼容各种文件系统,不确定目标目录挂载的 nfs ext 网盘之类文件系统可不可以这样操作文件
0o0O0o0O0o
207 天前
我想想怎么给它圆:可能有的 fs 不支持 seek ?
Davic1
207 天前
https://s3browser.com S3 broswer 从 AWS S3 上下载大文件,也是分成 N 个 100MB 的小东西下载,然后合并。
silencelixing
207 天前
我觉得应该是数据一致性的问题:
如果在下载过程中出现错误(例如网络中断),那么已经下载的部分可能会被破坏。如果所有数据都写入同一个文件,那么就需要重新下载整个文件。而如果数据被写入不同的文件,那么就只需要重新下载出现错误的那部分。

简要描述:单文件下载,如果出错,那么出错的代价太大了;而分文件下载,可以减少这个代价。
Ashe007
207 天前
@kenvix 感谢答疑,之前使用的是阿里的 oss 的依赖上传的文件,没有使用原生 Java 的流式上传
wysnxzm
207 天前
@Maerd #24 很多人都忽略或者有意识的跳过异常情况只考虑正常情况
效率和安全在成本相同的情况下只能置换,不会凭空产生不会凭空消失
augustheart
207 天前
@silencelixing 单文件的设计在这个情况下一般都是带一个配置文件解决,比如迅雷和快车。
yuzii
207 天前
单文件会一次性申请较大的磁盘空间,下载暂停的时候多文件停下来不会占用太多磁盘空间
我圆得如何
LXGMAX
207 天前
比特彗星不就是分段下进同一个文件
msg7086
207 天前
我就感叹一下没有见过网络蚂蚁和网际快车的年轻人。

w568w
207 天前
@yuzii 现代文件系统基本都是懒分配:写多少用多少,并不是你申请 1GB 空间,硬盘上就会少 1GB 空间。

所以还得再加个条件:远古的、不支持 prealloc 的文件系统。
wangritian
207 天前
别再线程了,全是 IO 任务
nuffin
207 天前
@0o0O0o0O0o 那还不如说他用的是磁带机 哈哈哈哈哈
nuffin
207 天前
@msg7086 自带一群蚂蚁咬木头的 BGM ,哈哈哈
GrayXu
207 天前
@augustheart #68 这是正交的吧,多个小文件一样需要配置额外检错机制。主要是“如果所有数据都写入同一个文件,那么就需要重新下载整个文件” 这个论点就是错误的。
GrayXu
207 天前
@ppllss #4 多线程就是分块下载的。。和几个文件并发没关系
GrayXu
207 天前
@kenvix #5 你要不说我还真不知道哪个下载软件的逻辑是“分别下载到单独的文件然后再合并” 🤣🤣
trzzzz
207 天前
用户用下载软件最终肯定是想看到 [一个] 文件,而不是多个小文件
weeei
207 天前
主流的实现就是写在一个大文件里,为了避免频繁读写会使用内存缓存,缓存满了再写入磁盘,当然就赌不会丢数据了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1039715

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX