Go'yu kullanarak büyük bir dosyayı indirmenin bir yolu var mı? Bu, içeriği bir dosyaya yazmadan önce belleğe kaydetmek yerine içeriği doğrudan bir dosyaya depolayacak mı? Dosya çok büyük olduğundan, bir dosyaya yazmadan önce hepsini bellekte saklamak tüm belleği kullanacak.Git'i kullanarak büyük bir dosyayı nasıl verimli bir şekilde indirebilirim?
cevap
ben http üzerinden indirmek (kısaca geçilmiştir hata kontrolleri) demek varsayıyoruz:
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)
size bir Reader alır herhangi bir işlev kullanabilmesi http.Response en Vücut, bir okuyucu olduğunu Örneğin Bir kerede bir kerede bir yığın okumak. Bu özel durumda, io.Copy()
sizin için gruntwork yapar.
İşte bir örnek. https://github.com/thbar/golang-playground/blob/master/download-files.go
Ayrıca bazı kodların size yardımcı olabileceğini düşünüyorum.
kodu: Steve M'in cevabın
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)
}
}
}
Bu örnek, tüm içeriğini ioutil.ReadAll() 'ile belleğe okur. Küçük dosyalar ile uğraştığın sürece sorun değil. – eduncan911
@ eduncan911, ancak büyük dosyalar hakkında açıkça konuştuğu ve hepsini belleğe almayı istemediği bu soru için iyi değil. –
Tam olarak doğru, bu yüzden yorum yaptım - başkalarının bunu büyük dosyalar için kullanmamalarını da bilmeleri için. – eduncan911
Bir daha açıklayıcı sürümü.
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
kullanarak yukarıdaki seçilen cevap İhtiyacınız ama kırık indirmeleri, otomatik adlandırma dosyaları, sağlama toplamı doğrulaması sürdürme veya çoklu indirme ilerlemesini izleme gibi ek özellikler ilginizi çekiyorsa, grab paketini ödeme tam olarak ne olduğunu.
- 1. Java'da bir dosyayı nasıl indirebilirim?
- 2. Perl kullanarak bir dosyayı nasıl indirebilirim?
- 3. Büyük dosyayı (2GB'a kadar) CUDA GPU'ya verimli bir şekilde aktarın?
- 4. Bir ikili dosyayı bir vektöre verimli şekilde nasıl okuyacağınız C++
- 5. Büyük bir Java haritasını verimli bir şekilde nasıl depolarsınız?
- 6. Ruby'de büyük metin dosyalarını verimli bir şekilde nasıl ayrıştırabilirim?
- 7. Binlerce dosyayı gerçek zamanlı olarak verimli bir şekilde nasıl arayabilirim?
- 8. Ruby kullanarak nasıl bir dosyayı HTTP üzerinden indirebilirim?
- 9. Django'da büyük site haritalarına verimli bir şekilde nasıl hizmet verilir
- 10. Dapper kullanarak bir toplama nesnesini verimli bir şekilde nasıl seçerim?
- 11. Sıkıştırılmamış bir InputStream'i gzip'ed InputStream'e verimli bir şekilde nasıl dönüştürebilirim?
- 12. Java - büyük miktarda String dizisini verimli bir şekilde depolamak
- 13. Bir std akışını başka bir şekilde verimli bir şekilde kopyalayın
- 14. Apache TomCat Server'da dinamik olarak oluşturduğum bir dosyayı nasıl indirebilirim?
- 15. Tabloları verimli bir şekilde karşılaştırın
- 16. HttpWebRequest/Response Bir Web Sunucusundan İkili (.exe) Dosyayı Nasıl İndirebilirim?
- 17. C++'yu verimli bir şekilde nasıl temizleyebilirim?
- 18. HBase Satırlarını verimli bir şekilde nasıl tarayabilirim?
- 19. Bir dosyayı nasıl güvenli bir şekilde silebilirim?
- 20. Dosyayı webview kullanarak nasıl indirebilirim? (bu durum garip)
- 21. (nasıl) JSoup kullanarak bir görüntü indirebilirim?
- 22. Uzak bir dosyayı cURL ile kısmen nasıl indirebilirim?
- 23. Büyük bir dosyayı CSVParser ile nasıl işlerim?
- 24. MySQL: Büyük bir tabloda satır sayısını verimli bir şekilde nasıl sayarsınız?
- 25. Zipf dağıtılmış sayıları verimli bir şekilde nasıl oluşturulur?
- 26. Webapp'ı başsız bir tarayıcıyla nasıl verimli bir şekilde yükleyebilirim?
- 27. 2D şekilleri bir dikdörtgene verimli bir şekilde yerleştirme. Nasıl yaklaşırsın?
- 28. Bir dosyayı normal bir ifade kullanarak okuyun.
- 29. Büyük bir dosyayı dize satırlarına okuma OCaml
- 30. Sembolden daha büyük bir şekilde nasıl geveleyebilirim?
'io.Copy' girişten 32kb (maksimum) okur ve bunları çıktıya yazar, sonra tekrar eder. Yani hafıza hakkında endişelenme. –