วิธีทำให้ wget เร็วขึ้นหรือมัลติเธรด


39

ฉันเพิ่งอัพเกรดฮาร์ดแวร์คอมพิวเตอร์ของฉัน (cpu + มาเธอร์บอร์ด + กราฟิกการ์ด + หน่วยความจำ + ฮาร์ดดิสก์) ดังนั้นจึงจำเป็นต้องติดตั้งระบบปฏิบัติการใหม่ ฉันพยายามดาวน์โหลดdebian-6.0.6-amd64-netinst.isoด้วยwgetคำสั่ง แต่ความเร็วช้ามากจนฉันทนไม่ได้ 4Kb/s ~ 17 Kb/sช้าเหมือนเต่าที่กำลังวิ่งหรือช้ากว่านี้ถ้าฉันใช้ Chrome

ฉันอ่านข้อมูลความช่วยเหลือของwgetแล้วดูเหมือนว่าไม่มีตัวเลือกใดที่สามารถทำให้เร็วขึ้นได้

อย่างไรก็ตามมีเพื่อให้wgetเร็วขึ้นหรือไม่ หรือเป็นไปได้ที่จะทำให้การดาวน์โหลดแบบมัลติเธรด ?

PS: แบนด์วิดธ์ของฉันคือ 4M ฉันใช้คำสั่งนี้:

wget -c url  http://hammurabi.acc.umu.se/debian-cd/6.0.6/amd64/iso-cd/debian-6.0.6-amd64-netinst.iso

1
เพียงแค่ใช้การเชื่อมต่อของคุณ ดังนั้นถ้ามันช้านั่นคือการเชื่อมต่อของคุณกับเซิร์ฟเวอร์ บางทีคุณอาจจะช้าเซิร์ฟเวอร์อาจจะ btw 4mbit = 0.5mb / s ไม่ต้องพูดถึงการสูญเสีย ฯลฯ
Dr_Bunsen

@Dr_Bunsenขอขอบคุณสำหรับคำแนะนำของคุณผมพยายามคำสั่งที่@Gufranแนะนำ: axelกว้างเมื่อเทียบwget, axelได้เร็วขึ้นกว่าที่เคย ผมคิดว่าในสถานการณ์ส่วนใหญ่คอขวดของความเร็วในการดาวน์โหลดของฉันอยู่ที่1 มีบางสิ่งที่ครอบครองแบนด์วิดท์ (อย่างที่คุณพูดว่า: ฉันช้า ) 2 . เดียวเธรด 3 . เซิร์ฟเวอร์ช้า แต่ฉันไม่มีอะไรจะทำอย่างไรกับการที่ 1 และ 3จุด
Teifi

@Teifi ความเป็นไปได้ข้อหนึ่งหากaxelมัลติเธรดทำงานได้ดีกว่า wget เมื่อใช้รีโมตเซิร์ฟเวอร์เดียวกันความหน่วงระหว่างกล่องของคุณกับเซิร์ฟเวอร์ระยะไกลนั้นสูงมาก ตรวจสอบ ping ของคุณไปยังเซิร์ฟเวอร์ระยะไกล
John Siu

คุณลองใช้ HTTrack แล้วหรือยัง httrack.com/page/1/th/index.html
amanthethy

คำตอบ:


52

ทำไมไม่ลองaxelล่ะ มันเป็น Downloader บรรทัดคำสั่งเต็มเปี่ยม

ติดตั้งaxelและวางไข่ดาวน์โหลดโดย

axel -a -n [Num_of_Thread] link1 link2 link3 ...

โดยที่'[Num_of_Thread]'จำนวนการเชื่อมต่อแบบขนานที่จะสร้างสำหรับแต่ละลิงก์ที่คุณต้องการดาวน์โหลด

-a เพียงแสดงแถบความคืบหน้าที่ได้รับการปรับปรุง

แอ็กเซิลดาวน์โหลดข้อมูลทั้งหมดไปยังไฟล์ปลายทางต่างจากตัวจัดการดาวน์โหลดอื่น ๆ มากมายโดยใช้เธรดเดียว สิ่งนี้ช่วยประหยัดเวลาในตอนท้ายเนื่องจากโปรแกรมไม่จำเป็นต้องต่อส่วนที่ดาวน์โหลดทั้งหมด


ฉันสงสัยว่ามีวิธีหรืออาจใช้นามแฝงและ wrapper เพื่อใช้ axel เมื่อมีให้ใช้แทน curl หรือ wget เว้นแต่ว่ามีพารามิเตอร์มากกว่าหนึ่งตัวในบรรทัดคำสั่ง
โซริน

1
ฉันคิดว่าข้อเสนอนี้ไม่เพียงพอสำหรับการดาวน์โหลดไฟล์เดียว โปรดแก้ไขฉันหากจำเป็น ความพยายามของฉันที่นี่askubuntu.com/q/813483/25388
LéoLéopold Hertz 준영

54

ฉันลองaxelตามคำแนะนำของGufranแต่มันก็ทำให้ฉันผิดหวังอย่างมาก เป้าหมายของฉันคือค้นหาการแทนที่ CLI DownThemAllเพราะมันทำให้ CPU และฮาร์ดดิสก์และทำให้ทั้งระบบช้าลงแม้ใน Mac Pro 8-core ฉันยังต้องการการแทนที่แบบมัลติเธรดสำหรับwgetและcurlไม่ใช่ kludge ของสคริปต์ที่รันหลายอินสแตนซ์ของสิ่งเหล่านี้ ดังนั้นผมจึงสืบค้นต่อไปและพบสิ่งที่ผมคิดว่าตอนนี้เป็นสุดยอดที่ทันสมัยที่สุด CLI มัลติเธรดดาวน์โหลดมี - aria2 ปัญหาใหญ่ที่ฉันมีaxelคือมัน 'ปลอม' ดาวน์โหลดไฟล์ผ่าน SSL tcdumpผมจับมันทำอย่างนั้นด้วย มันเป็นการดาวน์โหลดhttpsลิงก์ตามปกติhttp. นั่นทำให้ฉันโกรธมากและถ้าฉันไม่ได้ตรวจสอบฉันก็จะมีความปลอดภัยที่ผิดพลาด ฉันสงสัยว่าหลายคนรู้เกี่ยวกับการละเมิดความปลอดภัยอย่างร้ายแรงนี้ การย้อนกลับไปใช้aria2นั้นเป็นขั้นสูงกว่าตัวดาวน์โหลดอื่น ๆ รองรับโปรโตคอล HTTP (S), FTP, BitTorrent และ Metalink เป็นแพลตฟอร์มที่หลากหลายและเป็นกองโจรดาวน์โหลด มันเพิ่มแบนด์วิดท์สูงสุดของ ISP ของฉันโดยไม่โหลด CPU หรือฮาร์ดดิสก์ซึ่งแตกต่างจาก DTA หน้าคนมีขนาดใหญ่ ฉันจะไม่ใช้มากกว่าสองสามตัวเลือก และโอ้ BTW ฉันตรวจสอบประสิทธิภาพ SSL ด้วยtcdumpและเป็นของแข็งไม่ใช่ของปลอม ฉันเขียนสคริปต์ที่เลียนแบบพฤติกรรมของ DTA หากไม่สะดวก

คำสั่งพื้นฐานที่ฉันใช้เพื่อรับแบนด์วิดท์สูงสุดคือ

aria2c --file-allocation=none -c -x 10 -s 10 -d "mydir" URL

-cช่วยให้ความต่อเนื่องของการดาวน์โหลดถ้ามันได้รับการขัดจังหวะ-x 10และ-s 10ให้ถึง 10 การเชื่อมต่อเซิร์ฟเวอร์และไฟล์ผลไปยังไดเรกทอรี-d "mydir"mydir

aria2files.sh:

#!/bin/bash

filename="$1" # get filename from command line argument

while read -r line
do
    if [ "$line" ] # skip blank lines
    then
        if [[ "$line" =~ (https?|ftp)\:\/\/ ]] # line contains a URL, download file
        then
            echo "URL: '$line'"
            aria2c --file-allocation=none -c -x 10 -s 10 -d "$currdir" "$line"
        else # line contains a directory name, create directory if not already present
            echo "Directory: '$line'"
            currdir="$line"
            if [ ! -d "$currdir" ]
            then
                mkdir -p "$currdir" # '-p' enables creation of nested directories in one command
            fi
        fi
    fi
done < "$filename"

มันอ่านไฟล์ข้อความของรูปแบบ:

files.txt:

dierctory 1
url1
url2
…
directory 2/subdirectory/sub-subdirectory/…
url3
url4
…
…
…

สคริปต์อ่านชื่อไฟล์จากบรรทัดคำสั่ง:

aria2files.sh files.txt

มันสร้างไดเรกทอรีและดาวน์โหลดไปยังพวกเขา มันสามารถสร้างไดเรกทอรีที่ซ้อนกันตามที่แสดงในตัวอย่างที่สอง

สำหรับรายละเอียดเพิ่มเติมดูโพสต์ของฉันทุบตีสคริปต์เพื่อดาวน์โหลดไฟล์จาก URL ที่จะระบุไดเรกทอรีที่ระบุไว้ในแฟ้มข้อความ


คุณสามารถใช้วิธีการของคุณที่นี่ด้วยaskubuntu.com/q/813483/25388aria2c -x10 -s10 http://horatio.cs.nyu.edu/mit/tiny/data/tiny_images.binพยายามฆ่าตัวตายของฉัน
LéoLéopold Hertz 준영

ขอบคุณ @ hmj6jmh! สำหรับเรกคอร์ดใน Rapsberry Pi รุ่น 3: wget -4 -c <https://URL/ISO_FILE>ให้ฉัน ~ 40 KB / วินาที ( 87300K .......... .......... 11% 38.7K 4h28mเมื่อไฟล์เดียวกันดาวน์โหลดที่aria2c --disable-ipv6 -cให้ ~ 250 KB / วินาที ( 144MiB/717MiB(20%) CN:1 DL:250KiB ETA:39m3s]).
tuk0z

1
หากคุณ (เช่นฉัน) ต้องการหลีกเลี่ยง Sourceforge, aria2 เป็นส่วนหนึ่งของที่เก็บดังนั้นคุณสามารถติดตั้งได้ด้วยsudo apt install aria2
Bar

คำตอบที่ดี. สำหรับเว็บไซต์ที่บังคับใช้ HTTPS เท่านั้นaxelการสำรองข้อมูลจะไม่ทำงาน ดูเหมือนว่าจะได้รับการอัปเดตเพื่อใช้ HTTPS แต่เวอร์ชันนั้นยังไม่ได้อยู่ในที่เก็บของฉัน aria2ทำงานได้ดีสำหรับฉัน
WindowsEscapist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.