У меня есть большой файл размером 10 ГБ, который я пытаюсь загрузить с помощью multipart/form-data в Go через Postman. Поскольку я мало знаю, как работает загрузка файлов в Go, я нашел учебник на YouTube.
Загрузка файла работает нормально с файлами меньшего размера, но с файлами большего размера всегда происходит сбой с сообщением: "Время выполнения: Ошибка VirtualAlloc из 9193373696 байт с errno=1455 фатальная ошибка: нехватка памяти». Вот код, который я пытаюсь заставить работать:
err := r.ParseMultipartForm(500 << 20)
if err != nil {
fmt.Fprintln(w, err)
}
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Fprintln(w, err)
}
fmt.Fprintln(w, handler.Filename)
fmt.Fprintln(w, handler.Size)
fmt.Fprintln(w, handler.Header.Get("Content-type"))
defer file.Close()
saveLocation := "C:\\Users\\Pc\\go\\src\\github.com\\test\\uptest"
tempFile, err := ioutil.TempFile(saveLocation, "upload")
if err != nil {
fmt.Fprintln(w, err)
}
defer tempFile.Close()
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Fprintln(w, err)
}
tempFile.Write(fileBytes)
Отвечает ли это на ваш вопрос? Как я могу эффективно загрузить большой файл с помощью Go?
Поймите, что предлагаемый дубликат относится к загрузке, а не к загрузке, но основная проблема и решение одинаковы (используйте
io.copy
вместоReadAll
иWrite
, которые требуют, чтобы вы хранили файл в памяти).Если вы загружаете большой файл, вы можете разделить его на множество маленьких файлов; Загружать файлы одновременно; И объединить их на стороне сервера.
@Brits Это для загрузки файла на сервер или ПК. Мне нужно было загрузить файл на сервер. Но все равно спасибо.
@Brits Я пробовал много других решений и обнаружил, что загрузка файла создает копию во временном каталоге, но не знала, как получить эту копию.
@MiffaYoung Я знаю это, но я не знал, как поместить это в свой код. Я знаю, что файл хранится в памяти. Поскольку у меня всего 8 ГБ ОЗУ, а размер файла 10 ГБ, мне нужно хранить фрагменты данных во временном файле на диске, потому что на моем ПК недостаточно памяти для хранения всего файла. Но я не знал, как написать это в своем коде. Спасибо за ответ.