क्या समानांतर वाइज़ है? कुछ डाउनलोड करने के लिए ही?


15

मुझे केवल puf (समानांतर URL फ़िशर) मिला है, लेकिन मैं इसे किसी फ़ाइल से यूआरएल पढ़ने के लिए नहीं मिला; कुछ इस तरह

 puf < urls.txt

काम भी नहीं करता है।

सर्वर पर स्थापित ऑपरेटिंग सिस्टम उबंटू है।


यह पायथन और पाइक्लुर लाइब्रेरी और स्क्रिप्ट में थोड़ा सा ग्लू लॉजिक के साथ किया जा सकता है। लेकिन मुझे उसके लिए "डिब्बाबंद" टूल का पता नहीं है।
कीथ

@Keith क्या यह दृष्टिकोण कुछ async लाइब्रेरी का उपयोग करने से बेहतर है जैसा कि urllib के साथ gevent?
मूनवल्कर

urllib को अतुल्यकालिक रूप से उपयोग करने के लिए डिज़ाइन नहीं किया गया है। Libcurl के पास स्वयं का एस्प्रि लूप है और इसे "मल्टी" इंटरफ़ेस का उपयोग करके कम से कम 1000 एक साथ लाने के लिए सेट किया जा सकता है।
कीथ

@ क्या मुझे आपका उत्तर सबसे अच्छा लगता है, तो क्या आप इसे इसके लिए उचित श्रेय लेने के लिए "वास्तविक" उत्तर के रूप में लिख सकते हैं?
मूनवल्कर

जवाबों:


25

GNU समानांतर का उपयोग ,

$ समानांतर -j $ {नौकरियां} wget <urls.txt

या xargsसे जीएनयू Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

जहाँ आप ${jobs}अधिकतम संख्या को wgetसमवर्ती रूप से चलाने की अनुमति देना चाहते हैं ( प्रति पंक्ति एक मंगलाचरण प्राप्त -nकरने के 1लिए सेटिंग )। बिना / के , CPU कोर के रूप में एक समय में कई नौकरियों के रूप में चलेगा (जो कि आवश्यक रूप से नेटवर्क IO द्वारा बाध्य होने का कोई मतलब नहीं है ), और एक समय में एक चलेगा।wgeturls.txt-j-Pparallelwgetxargs

एक अच्छी विशेषता जो parallelखत्म हो गई xargsहै, वह समवर्ती रूप से चलने वाली नौकरियों के आउटपुट को अलग कर रही है, लेकिन अगर आप इस बारे में परवाह नहीं करते हैं, xargsतो पूर्व-स्थापित होने की अधिक संभावना है।


इष्टतम jobsकई कारकों पर निर्भर करता है: पथ विलंबता, पथ बैंडविड्थ, दूरस्थ सर्वर नीतियां, आदि
dhchdhd

6

यह उत्तर एक वास्तविक उदाहरण के साथ सुधारा जाएगा जो पूछे गए समस्या को हल करता है, इसके बजाय, यह लिंक-ओनली उत्तर के रूप में उत्तीर्ण होता है। meta.stackexchange.com/questions/225370/...
जेफ स्कालर

2

आप पायथन और पाइक्लुर लाइब्रेरी का उपयोग करके इसे लागू कर सकते हैं। Pycurl लाइब्रेरी में "मल्टी" इंटरफ़ेस है जो अपने स्वयं के लूप को लागू करता है जो एक साथ कई कनेक्शन सक्षम करता है।

हालाँकि इंटरफ़ेस सी-लाइक है और इसलिए अन्य, अधिक "पायथोनिक", कोड की तुलना में थोड़ा बोझिल है।

मैंने इसके लिए एक रैपर लिखा जो इसके शीर्ष पर एक अधिक पूर्ण ब्राउज़र-जैसे क्लाइंट बनाता है। आप एक उदाहरण के रूप में उपयोग कर सकते हैं। Pycopia.WWWclient मॉड्यूल देखें । HTTPConnectionManager मल्टी इंटरफ़ेस को लपेटता है।


2

यह काम करता है, और उचित समायोजन के साथ स्थानीय या दूरस्थ DoS नहीं करेगा:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)

1

जीएनयू समानांतर के मैन पेज के हिस्से में समानांतर पुनरावर्ती wget का उदाहरण है।

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTML दो बार डाउनलोड की जाती है: एक बार लिंक निकालने के लिए और एक बार डिस्क पर डाउनलोड करने के लिए। अन्य सामग्री केवल एक बार डाउनलोड की जाती है।

यदि आपको पुनरावृत्ति की आवश्यकता नहीं है, तो अभिक्षमता का उत्तर स्पष्ट प्रतीत होता है।


बस एक देर से FYI करें कि कोई भी समांतर प्लस wget "समाधान" दोनों ही स्वाभाविक रूप से अक्षम है क्योंकि इसमें दो बार सामग्री डाउनलोड करने की आवश्यकता होती है , सभी मल्टीफ़ेज डाउनलोड करने के कारण धीमी गति से और यह उन sysops के लिए भी अच्छा नहीं है जिन्हें आपके सभी बैंडविड्थ की बर्बादी के लिए भुगतान करना पड़ता है - 'एक कुशल समाधान का उपयोग न करें।
dhchdhd

0

आपके पैरेलल डाउनलोड के पीड़ितों को खुश नहीं किया जाएगा: वे प्रत्येक ग्राहक की सेवा के लिए एक कनेक्शन की उम्मीद करते हैं, कई कनेक्शन स्थापित करने का मतलब है कुल ग्राहकों का कम होना। (यानी, यह अशिष्ट व्यवहार माना जाता है)।


1
लेकिन वह विभिन्न सर्वरों से फाइल डाउनलोड कर रहा होगा, इसलिए यह लागू नहीं होगा।
रेनान

@Vonbrand ने जो कहा उसके अलावा, आपको "बहुत सारे कनेक्शन" जैसा कुछ मिल सकता है और सभी फ़ाइलों को डाउनलोड करने में सक्षम नहीं होना चाहिए। और यह थोड़ा धीमा हो सकता है (उदाहरण के लिए कई HTTP कनेक्शन बनाने की तुलना में एक HTTP कनेक्शन का पुन: उपयोग करना)
golimar

2
जब तक आप नंबर को सेंस रखते हैं, यह कोई बड़ी बात नहीं है। उदाहरण के लिए, जिस समय आपने यह लिखा था, फ़ायरफ़ॉक्स लगातार कनेक्शन का उपयोग नहीं करने पर सर्वर से 15 कनेक्शन का उपयोग कर रहा था (वे तब से केवल निरंतर कनेक्शन की कोशिश कर रहे हैं, जो 6 प्रति सर्वर तक सीमित हैं)। अन्य ब्राउज़र समान संख्याओं का उपयोग करते हैं।
व्युत्पन्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.