Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему
Вы должны загрузить файл в 5MiB + кусках через многопоточный API S3 . Каждый из этих блоков требует Content-Length, но вы можете избежать загрузки огромных объемов данных (100MiB +) в память.
S3 позволяет до 10000 частей. Таким образом, выбрав размер 5MiB, вы сможете загружать динамические файлы до 50GiB. Должно быть достаточно для большинства случаев использования.
Однако: если вам нужно больше, вам нужно увеличить размер детали. Либо используя более высокий размер детали (например, 10MiB), либо увеличивая его во время загрузки.
First 25 parts: 5MiB (total: 125MiB)
Next 25 parts: 10MiB (total: 375MiB)
Next 25 parts: 25MiB (total: 1GiB)
Next 25 parts: 50MiB (total: 2.25GiB)
After that: 100MiB
Это позволит вам загружать файлы до 1 ТБ (ограничение S3 для одного файла равно 5TB прямо сейчас), не теряя память без необходимости.
Его проблема отличается от ваш - он знает и использует Content-Length перед загрузкой. Он хочет улучшить ситуацию: многие библиотеки обрабатывают загрузки, загружая все данные из файла в память. В псевдокоде, который был бы примерно таким:
data = File.read(file_name)
request = new S3::PutFileRequest()
request.setHeader('Content-Length', data.size)
request.setBody(data)
request.send()
Его решение делает это, получая Content-Length
через файловую систему-API. Затем он передает данные с диска в поток запросов. В псевдокоде:
upload = new S3::PutFileRequestStream()
upload.writeHeader('Content-Length', File.getSize(file_name))
upload.flushHeader()
input = File.open(file_name, File::READONLY_FLAG)
while (data = input.read())
input.write(data)
end
upload.flush()
upload.close()
См. дополнительные сведения о запросах многостраничных объектов HTTP. Вы можете отправить файл в виде кусков данных в цель.
Поместите этот ответ для других, если это поможет:
Если вы не знаете длину данных, которые вы передаете на S3, вы можете использовать S3FileInfo
и OpenWrite()
метод записи произвольных данных в S3.
var fileInfo = new S3FileInfo(amazonS3Client, "MyBucket", "streamed-file.txt");
using (var outputStream = fileInfo.OpenWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
streamWriter.WriteLine("Hello world");
// You can do as many writes as you want here
}
}
Если вы используете Node.js, вы можете использовать плагин как s3-streaming-upload , чтобы выполнить это довольно легко.
Вы можете использовать инструмент командной строки gof3r для простого потока linux-труб:
$ tar -czf - <my_dir/> | gof3r put --bucket <s3_bucket> --key <s3_object>