Goを使用して大きなファイルをダウンロードする方法はありますか?コンテンツをファイルに書き込む前に、すべてをメモリに保存するのではなく、ファイルに直接保存しますか?ファイルが非常に大きいので、ファイルに書き込む前にすべてをメモリに格納すると、すべてのメモリが使い果たされます。Goを使用して大きなファイルを効率的にダウンロードするにはどうすればよいですか?
答えて
私はあなたが(エラーチェックが簡略化のために省略)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
また、いくつかのコードが役立つかもしれません。
コード:スティーブ・Mの答えの
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マップを効率的に保存するにはどうすればよいですか?
- 3. C/C++を使用して、巨大なcsvファイル(1000×1000行)を効率的に結合するにはどうすればよいですか?
- 4. ハイパーで大きなファイルをダウンロードしてエラーで再開するにはどうすればよいですか?
- 5. データベースの大規模な更新を効率的に行うにはどうすればよいですか?
- 6. 大きなハッシュマップをメモリ上で効率よくソートするにはどうすればいいですか?
- 7. JAVAで非常に大きなファイル(4GBと言う)を効率的に読み込むにはどのようにすればよいでしょうか?
- 8. rubyを使用して複数の動的ファイルをダウンロードするにはどうすればよいですか?
- 9. Javaを使用して大きなXMLファイルを解析するにはどうすればよいですか?
- 10. このユースケースでDataContractSerializerを効率的に使用するにはどうすればよいですか?
- 11. Androidで管理クエリを効率的に使用するにはどうすればよいですか?
- 12. Pythonを使用して大きなcsvファイルを書き込むにはどうすればよいですか?
- 13. ファイルに数値データを効率的に書き込むにはどうすればよいですか?
- 14. JavaのR予測モデルを効率的に使用するにはどうすればよいですか?
- 15. iPhone SDKを使用して大きなファイルをダウンロードし、メモリ使用の問題を回避するにはどうすればよいですか?
- 16. hdfsのファイル名をより効率的に変更するにはどうすればいいですか?
- 17. Scala Streamクラスを使用して大きなCSVファイルを読むにはどうすればよいですか?
- 18. goでos.Name()を使用するにはどうすればよいですか?
- 19. 膨大な列挙数を効率的に処理するために複数のsidekiqワーカーを使用するにはどうすればよいですか?
- 20. パンダを使用すると、大規模なDataFrameをグループ単位で効率的にサブサンプルするにはどうすればよいですか?
- 21. ディレクトリ内のファイル数を効率的に取得するにはどうすればよいですか?
- 22. UFTを使用してExcelファイルをダウンロードして保存するにはどうすればよいですか?
- 23. マトリックスデータをSVGのヒートマップとして効率的にレンダリングするにはどうすればよいですか?
- 24. ダブルループで条件付きチェックを効率的に実行するにはどうすればよいですか?
- 25. MsBuildコミュニティタスクWebDownloadを使用してファイルを適切にダウンロードするにはどうすればよいですか?
- 26. マルチチャネルnumpy ndarrayにトランスフォームを効率的に適用するにはどうすればよいですか?
- 27. jsfを使って効率的にWebアプリケーションを開発するにはどうすればいいですか
- 28. Goで相対パスを使用してファイルを開くにはどうすればよいですか?
- 29. 出力ストリームを使用して、または効率的にデータをファイルに保存するにはどうすればよいですか?
- 30. vbaを使用してGoogleドライブからExcelファイルをダウンロードするにはどうすればよいですか?
'io.Copy'は入力から32kb(最大)を読み込んで出力に書き込んだ後、繰り返すことに注意してください。だからメモリについて心配しないでください。 –