Amazon S3 Transferutility использует FilePath или Stream?

1

При загрузке файла на S3 с использованием класса TransportUtility существует возможность использовать FilePath или входной поток. Я использую многокомпонентные загрузки.

Я загружаю множество вещей, некоторые из которых являются файлами на диске, а другие - сырыми потоками. В настоящее время я использую сорт InputStream для всего, что работает нормально, но мне интересно, буду ли я специализировать метод дальше. Для файлов на диске я в основном использую File.OpenRead и File.OpenRead этот поток в InputStream запроса на передачу.

Есть ли какие-либо выгоды от производительности или нет, чтобы предпочесть метод FilePath над InputStream где ввод известен как файл.

Короче: это то же самое

using (var fs = File.OpenRead("some path")) 
{
    var uploadMultipartRequest = new TransferUtilityUploadRequest
    {
        BucketName = "defaultBucket",
        Key = "key",
        InputStream = fs,
        PartSize = partSize
    };

    using (var transferUtility = new TransferUtility(s3Client))
    {
        await transferUtility.UploadAsync(uploadMultipartRequest);
    }
}

В виде:

    var uploadMultipartRequest = new TransferUtilityUploadRequest
    {
        BucketName = "defaultBucket",
        Key = "key",
        FilePath = "some path",
        PartSize = partSize
    };

    using (var transferUtility = new TransferUtility(s3Client))
    {
        await transferUtility.UploadAsync(uploadMultipartRequest);
    }

Или есть ли существенная разница между ними? Я знаю, если файлы большие или нет, и может предпочесть тот или иной метод на основе этого.

Редактирование: я также сделал некоторую декомпиляцию S3Client, и действительно есть какая-то разница в отношении уровня параллелизма передачи, как это MultipartUploadCommand.cs в MultipartUploadCommand.cs

private int CalculateConcurrentServiceRequests()
{
  int num = !this._fileTransporterRequest.IsSetFilePath() || this._s3Client is AmazonS3EncryptionClient ? 1 : this._config.ConcurrentServiceRequests;
  if (this._totalNumberOfParts < num)
    num = this._totalNumberOfParts;
  return num;
}
  • 0
    На самом деле это не имеет значения, даже если один из них в 100 раз медленнее другого, он незначителен по сравнению со скоростью ввода-вывода диска, выбрал версии, в которых меньше строк кода, что делает его гораздо более быстрым для понимания и поддержки другими программистами.
Теги:
amazon-s3

1 ответ

1
Лучший ответ

Из документации TransferUtility:

При загрузке больших файлов путем указания путей к файлам вместо потока TransferUtility использует несколько потоков для одновременной загрузки нескольких частей одной загрузки. При работе с большими размерами контента и высокой пропускной способностью это может значительно увеличить пропускную способность.

Который говорит, что использование путей к файлам будет использовать загрузку MultiPart, но использование потока не будет.

Но когда я прочитал этот метод загрузки (stream, bucketName, key):

Загружает содержимое указанного потока. Для больших загрузок файл будет разделен и загружен по частям с использованием многоадресного API Amazon S3. Детали будут повторно собраны как один объект в Amazon S3.

Это означает, что MultiPart также используется для потоков.
Amazon рекомендует использовать загрузку MultiPart, если размер файла превышает 100 МБ. Http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html

Multipart upload позволяет загружать один объект в виде набора деталей. Каждая часть является смежной частью данных объекта. Вы можете загружать эти части объекта самостоятельно и в любом порядке. Если передача какой-либо части не удалась, вы можете повторно передать эту часть, не затрагивая другие части. После того, как все части вашего объекта загружены, Amazon S3 собирает эти части и создает объект. В общем случае, когда размер вашего объекта достигает 100 МБ, вы должны рассмотреть возможность использования многостраничных загрузок вместо загрузки объекта за одну операцию.

Использование многостраничной загрузки обеспечивает следующие преимущества:

Улучшенная пропускная способность. Вы можете загружать детали параллельно, чтобы повысить пропускную способность. Быстрое восстановление при любых сетевых проблемах. Меньший размер детали минимизирует влияние перезапуска неудачной загрузки из-за сетевой ошибки. Пауза и возобновление загрузки объектов. Вы можете загружать части объекта с течением времени. После запуска многостраничной загрузки нет истечения срока действия; вы должны явно заполнить или прервать многостраничную загрузку. Начните загрузку, прежде чем узнать конечный размер объекта. Вы можете загрузить объект по мере его создания.

Таким образом, на основе Amazon S3 нет никакого различия между использованием Stream или File Path, но он может немного отличаться от вашего кода и ОС.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню