迅雷下載時為什麼要在存儲空間內事先建立一個和要下載文件大小相同的文件?這樣做有什麼優點?

迅雷是多線程下載,為什麼不這樣做:等下載結束後,把各個線程下載好的文件塊組合在一起。相比這種方法,迅雷這種多線程直接往文件中寫入內容的方法有什麼優點?在這裡,這種方法有沒有提高速度?


我從非技術的角度來解釋這個問題,在07年我做迅雷下載數據分析的時候,我們會重點分析下載失敗的情況。

沒記錯的話,每天大概有10%左右的下載會失敗。除了遠程機器無響應、重試99次還沒有下載進度、迅雷協議被運營商封殺等我們有可能解決的問題外,所有失敗原因最大的一個比例就是「磁碟空間不足」。

「磁碟空間不足」,你能想到么?居然超過5%(如果沒記錯的話)因為磁碟空間不足而失敗!!!

那堆高清黨動漫黨,一個連續劇動漫全集幾十G的文件,把BT種子添加到迅雷,然後一夜掛機下載。第二天起來如果迅雷提示它磁碟空間不足而導致浪費了一個晚上的掛機時間,你難道不會憤怒地說「這是啥垃圾軟體么?」

所以,從減少這種用戶抱怨的角度來說,提前就把空間這件事提示了。你添加的時候就告訴你要換個目錄或者你選一部分下載,好過你掛機半天過來查看進度因為沒空間而失敗來得好喲。


排了半天隊到窗口了發現沒有帶身份證的感覺


第一個問題:

兩個優點

1,速度要更快,題主提出的方案,會有很多打開關閉文件的操作,這很費時間,當文件數量比較多的時候,速度下降會很明顯,題主可以試試拷貝1個1g的文件和1024個1m的文件比比看速度。

2,預先佔位,防止硬碟空間不足,因為是斷點續傳的需求,萬一傳一半,硬碟滿了,這就很尷尬了

3,省空間,題主的方案需要在合併的時候多留一份拷貝用的臨時空間才行,要不沒法合併(把文件接起來這種事,在操作系統上是建立一個新文件,然後把內容拷過去來實現的,不是直接接,做不到)

第二個問題:

題主說提高速度,得看跟誰比,其實這個主要是在斷點續傳的需求下可能是最好的,比直接下不一定,因為多了寫入斷點信息和區塊信息的時間,但肯定比題主提的方案要快,原因上面說了。


方法1:

先分配足夠的空間,然後第一個線程把第1~1M位元組下載下來填入該空間前1M位元組裡面,線程2把第1M~2M位元組內容下載下來填入第二個1M位元組裡面,依此類推。

下完後你就得到了完整的文件。

方法2:

線程1產生一個1M位元組的文件,線程2產生另一個1M位元組的文件,依此類推。

下完後你得到N個部分文件,然後你得再建立一個新文件,把這N個部分文件依次拷進新文件,合併得到了完整的文件。

你說兩者有沒有差別。


1 一個大的文件可以把坑佔用了,萬一磁碟不夠大,你下了一大半發現磁碟不夠了,這個時候要用戶去處理其實挺麻煩。

2 下載數據好管理,用戶刪除就直接刪除,如果對於多塊數據,管理比較麻煩。反而會增加磁碟操作。


先佔坑,才能往裡寫東西,萬一下載完了沒地方呢?

我自己寫過一個很簡單的下載器,提前申請一個大文件,多個線程的網路請求下載一個文件的不同部分,然後每個線程都開始寫入到申請的大文件中,全部線程都寫完了就下載完了。


無聊扯一下

多線程下載一個文件一般來說是每一個線程下一個文件,下完以後再並成一個文件,然後驗碼

但這樣會讓很大的文件在合併文件的時候非常非常慢,因為硬碟得一邊讀一邊寫,你會不禁有種煎熬的感覺

於是,一開始就生成一個目標大小的空文件,然後再複寫,這樣一來下完就真的下完了,你就不用等合併了,你就會感覺非常好,非常棒

什麼?會不會影響下載速度?我還沒見過有多少人的網速能超過硬碟寫入速度的。


竟然都是說提前占空間的,不得不承認,肯定是一個原因。但是我覺得更多的是迅雷下來速度和持續性都是變化的,一會增加一個數據塊,然後分配空間,就相當於下載個10g的文件,在文件系統層面相當於下載了100萬個小文件。區別是文件系統的頭部損耗輕一點,但像ntfs那種B+樹文件系統,我想想就心疼,這個文件在實際的存儲介質中得到處飛,這一個小塊那邊一個。磁碟的文件系統整體就是干這個活的。時間長了不整理,像迅雷那種應用動不動下幾百個g的片的長跑,你如果不提前分配磁碟,我是磁碟我就罷工了。。。。沒哪個文件系統能很好的處理小塊的問題,ext4的extend機制還行。ntfs在你佔多了,說不定給你來一次大轉移。好傢夥,明明只有下載,現在還多了複製操作。想想都累。還是提前分好吧。。。


1、作為試探用戶磁碟空間是否足夠的手段,如果無法得到空間還和伺服器之間進行過多的連接和資源初始化工作是沒有意義的,減輕伺服器壓力;

2、IO是很費時費力的工作,本來下載就進行了大量的網路IO操作,此時如果一點點的分配磁碟空間無形間增加了磁碟IO,不如一次分配夠;

3、並行下載,可以對100M的文件起5個線程(好像是默認),那麼每個線程在文件的每個二十分位處開始下載,這樣效率最高。


發現資源後,會玩兒命的下載,然後沒發現磁碟已經不足了,這事兒怎麼能亂說。


分區又不是迅雷獨佔的,萬一下載之前空間夠然後一下到99%時你看了幾個網頁臨時文件佔用了點空間分區滿了怎麼辦?


不怕文件大,就怕文件多


推薦閱讀:

網線上繞電池可以提高網速的說法真實嗎?
如何徹底解決「網路延遲」這個問題?
浩方等對戰平台的原理是什麼?
為什麼自我調侃、分享自己糗事的網站那麼火,而卻沒有一個分享自己好事的網站火起來?
像qq這類的軟體怎樣實現通信的呢?

TAG:迅雷軟體 | 計算機網路 | 下載文件 | 多線程 | 電腦網路 |