Прочитайте файл zip zip и извлеките содержимое в виде отдельного файла [duplicate]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

36
задан Tyler 28 December 2011 в 09:35
поделиться

5 ответов

Вы должны загрузить файл в 5MiB + кусках через многопоточный API S3 . Каждый из этих блоков требует Content-Length, но вы можете избежать загрузки огромных объемов данных (100MiB +) в память.

  • Инициировать S3 Multipart Upload .
  • Собирайте данные в буфер до тех пор, пока этот буфер не достигнет нижнего предела размера блока (5MiB) S3. Создайте контрольную сумму MD5 при создании буфера.
  • Загрузите этот буфер в качестве части , сохраните ETag (прочитайте документы на этом).
  • Once вы достигаете EOF ваших данных, загрузите последний фрагмент (который может быть меньше 5MiB).
  • Завершите загрузку многостраничных файлов.

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()
47
ответ дан Marcel Jackwerth 23 August 2018 в 18:31
поделиться

См. дополнительные сведения о запросах многостраничных объектов HTTP. Вы можете отправить файл в виде кусков данных в цель.

1
ответ дан Kris 23 August 2018 в 18:31
поделиться

Поместите этот ответ для других, если это поможет:

Если вы не знаете длину данных, которые вы передаете на 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
    }
}
7
ответ дан mwrichardson 23 August 2018 в 18:31
поделиться

Если вы используете Node.js, вы можете использовать плагин как s3-streaming-upload , чтобы выполнить это довольно легко.

1
ответ дан nathanpeck 23 August 2018 в 18:31
поделиться

Вы можете использовать инструмент командной строки gof3r для простого потока linux-труб:

$ tar -czf - <my_dir/> | gof3r put --bucket <s3_bucket> --key <s3_object>
5
ответ дан webwurst 23 August 2018 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: