क्या गो का उपयोग करके एक बड़ी फ़ाइल डाउनलोड करने का कोई तरीका है जो सामग्री को फ़ाइल में लिखने से पहले इसे स्मृति में संग्रहीत करने के बजाय सीधे फ़ाइल में संग्रहीत करेगा? चूंकि फ़ाइल इतनी बड़ी है, इसे फाइल में लिखने से पहले इसे स्मृति में संग्रहीत करना सभी मेमोरी का उपयोग करने जा रहा है।मैं गो का उपयोग कर एक बड़ी फाइल को कुशलतापूर्वक कैसे डाउनलोड कर सकता हूं?
उत्तर
मैं आप http के माध्यम से डाउनलोड (त्रुटि जाँच संक्षिप्तता के लिए छोड़े गए) मतलब मान लेंगे:
import ("net/http"; "io"; "os")
...
out, err := os.Create("output.txt")
defer out.Close()
...
resp, err := http.Get("http://example.com/")
defer resp.Body.Close()
...
n, err := io.Copy(out, resp.Body)
तो आप किसी भी कार्य करता है कि करने के लिए एक रीडर ले, उपयोग कर सकते हैं http.Response बॉडी, एक रीडर है, जैसे एक बार में एक बार में एक बार एक टुकड़ा पढ़ें। इस विशिष्ट मामले में, io.Copy()
आपके लिए गड़बड़ी करता है।
यहां एक नमूना है। https://github.com/thbar/golang-playground/blob/master/download-files.go
मैं आपको कुछ कोड भी आपकी मदद कर सकता हूं।
कोड:
func HTTPDownload(uri string) ([]byte, error) {
fmt.Printf("HTTPDownload From: %s.\n", uri)
res, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
d, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ReadFile: Size of download: %d\n", len(d))
return d, err
}
func WriteFile(dst string, d []byte) error {
fmt.Printf("WriteFile: Size of download: %d\n", len(d))
err := ioutil.WriteFile(dst, d, 0444)
if err != nil {
log.Fatal(err)
}
return err
}
func DownloadToFile(uri string, dst string) {
fmt.Printf("DownloadToFile From: %s.\n", uri)
if d, err := HTTPDownload(uri); err == nil {
fmt.Printf("downloaded %s.\n", uri)
if WriteFile(dst, d) == nil {
fmt.Printf("saved %s as %s\n", uri, dst)
}
}
}
यह उदाहरण 'ioutil.ReadAll() 'के साथ, संपूर्ण सामग्री को मेमोरी में पढ़ता है। यह ठीक है, जब तक आप छोटी फाइलों से निपट रहे हैं। – eduncan911
@ eduncan911, लेकिन यह इस प्रश्न के लिए ठीक नहीं है जो स्पष्ट रूप से बड़ी फ़ाइलों के बारे में बात करता है और इसे सभी को स्मृति में चूसना नहीं चाहता। –
बिल्कुल सही, यही कारण है कि मैंने टिप्पणी की - दूसरों को यह जानने के लिए कि बड़ी फ़ाइलों के लिए इसका उपयोग न करें। – eduncan911
एक स्टीव एम के जवाब का अधिक वर्णनात्मक संस्करण।
import (
"os"
"net/http"
"io"
)
func downloadFile(filepath string, url string) (err error) {
// Create the file
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Check server response
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("bad status: %s", resp.Status)
}
// Writer the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
जवाब io.Copy
का उपयोग कर ऊपर चुनी गई है कि तुम क्या जरूरत है, लेकिन यदि आप टूटी डाउनलोड, ऑटो नामकरण फ़ाइलों, चेकसम वैधता की जाँच शुरू करने या एक से अधिक डाउनलोड की प्रगति की निगरानी की तरह अतिरिक्त सुविधाओं में रुचि रखते हैं, grab पैकेज चेकआउट ठीक है।
- 1. मैं बड़ी फ़ाइलों को कैसे विभाजित कर सकता हूं?
- 2. मैं java.awt.Composite को कुशलतापूर्वक कैसे कार्यान्वित कर सकता हूं?
- 3. मैं एक गो प्रोग्राम कैसे संकलित कर सकता हूं?
- 4. मैं एक असम्पीडित इनपुटस्ट्रीम को एक gzip'ed इनपुट स्ट्रीम में कुशलतापूर्वक कैसे परिवर्तित कर सकता हूं?
- 5. (कैसे) मैं JSoup का उपयोग कर एक छवि डाउनलोड कर सकता हूं?
- 6. मैं एक एमवीसी नियंत्रक से डाउनलोड करने के लिए एक फाइल कैसे पेश कर सकता हूं?
- 7. मैं एनएचबीर्नेट के साथ कुशलतापूर्वक टीडीडी कैसे कर सकता हूं?
- 8. जब एक फाइल डाउनलोड कर कर्ल
- 9. मैं JOGL कहां डाउनलोड कर सकता हूं?
- 10. मैं Google स्प्रेडशीट एपीआई का उपयोग कैसे कर सकता हूं?
- 11. जर्सी का उपयोग कर पीडीएफ फाइल कैसे डाउनलोड करें?
- 12. मैं एक HttpClient कनेक्शन को कुशलतापूर्वक कैसे उपयोग कर सकता हूं?
- 13. मैं ascmd.exe कहां डाउनलोड कर सकता हूं?
- 14. क्लोजर में मैं बड़ी एक्सएचटीएमएल फाइल को आलसी तरीके से कैसे पार्स कर सकता हूं?
- 15. मैं wget -i का उपयोग कर फ़ाइल नाम कैसे डाउनलोड और सेट कर सकता हूं?
- 16. मैं php का उपयोग कर फ़ाइल डाउनलोड कैसे कर सकता हूं?
- 17. मैं बड़ी एक्सएमएल फ़ाइल लिखने के लिए नोकोगिरी का उपयोग कैसे कर सकता हूं?
- 18. क्या मैं विम में एक फाइल ट्रांसफर कर सकता हूं?
- 19. मैं वेबिएंट का उपयोग करके कई फाइलें कैसे डाउनलोड कर सकता हूं, लेकिन एक समय में?
- 20. मैं सिम्फनी 2 में सिद्धांत के साथ कुशलतापूर्वक पेजिनेट का उपयोग कैसे कर सकता हूं?
- 21. मैं जावा से आर पूर्वानुमान पूर्वानुमान मॉडल का कुशलतापूर्वक उपयोग कैसे कर सकता हूं?
- 22. मैं यूआरएल से फाइल कैसे डाउनलोड कर सकता हूं और इसे रेल में कैसे सहेज सकता हूं?
- 23. .hgignore का उपयोग कर एक को छोड़कर मैं सभी निर्देशिकाओं को कैसे अनदेखा कर सकता हूं?
- 24. मैं दो [] बाइट स्लाइस या सरणी के साथ गो एपेंड का उपयोग कैसे कर सकता हूं?
- 25. मैं सिगविन का ऑफ़लाइन इंस्टॉलर कहां डाउनलोड कर सकता हूं?
- 26. मैं एक हेडलेस ब्राउज़र के साथ वेबपैप का कुशलतापूर्वक परीक्षण कैसे लोड कर सकता हूं?
- 27. मैं एक आईफोन पर एक बड़ी यूटीएफ -8 फाइल कैसे पढ़ सकता हूं?
- 28. मैं कई फ़ाइलों को एक नए सर्वर पर कुशलतापूर्वक कैसे स्थानांतरित कर सकता हूं?
- 29. fwrite() का उपयोग कर एक फाइल
- 30. मैं एक अविश्वसनीय कनेक्शन पर एक बड़ी गिट भंडार कैसे क्लोन कर सकता हूं?
ध्यान दें कि 'io.Copy' इनपुट से 32kb (अधिकतम) पढ़ता है और उन्हें आउटपुट में लिखता है, फिर दोहराता है। तो स्मृति के बारे में चिंता मत करो। –