Go で大きなファイルを効率的にダウンロードする
大きなファイルをダウンロードするときは、書き込む前にファイル全体をメモリに保存しないことが重要ですメモリ リソースを使い果たす可能性があるため、ディスクに保存されます。 Go では、大きなファイルのダウンロードを効率的に処理する方法がいくつかあります。
方法 1: ストリーミング ダウンロード
最も効果的なアプローチは、ストリーミング ダウンロードを使用することです。チャンク単位で読み書きされるため、メモリ消費が最小限に抑えられます。これは、Reader と Writer で io.Copy() 関数を使用して実現できます。
import ( "net/http" "io" "os" ) // DownloadFile downloads a file using streaming. func DownloadFile(url, dst string) (int64, error) { out, err := os.Create(dst) if err != nil { return 0, err } defer out.Close() resp, err := http.Get(url) if err != nil { return 0, err } defer resp.Body.Close() return io.Copy(out, resp.Body) }
方法 2: 一時ファイルを使用する
もう 1 つの手法は次のとおりです。一時ファイルを使用してダウンロードを保存し、完了したら最終ファイルに置き換えます:
import ( "io/ioutil" "net/http" "os" ) // DownloadFile downloads a file using a temporary file. func DownloadFile(url, dst string) error { resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() tmp, err := ioutil.TempFile("", "tmp") if err != nil { return err } defer tmp.Close() if _, err := io.Copy(tmp, resp.Body); err != nil { return err } return os.Rename(tmp.Name(), dst) }
これらの方法を採用することで、開発者はメモリ制限を超えることなく Go で大きなファイルを効率的にダウンロードできます。
以上がメモリの過負荷を発生させずに、Go で大きなファイルを効率的にダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。