2014-11-04 5 views
1

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

Я загружаю множество вещей, некоторые из которых являются файлами на диске, а другие - сырыми потоками. В настоящее время я использую сорт InputStream для всего, что работает нормально, но мне интересно, следует ли мне дополнительно специализировать этот метод. Для файлов на диске я в основном использую 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); 
    } 

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

Edit: Я также сделал некоторые декомпилировать S3Client, и действительно, кажется, какая-то разница в отношении уровня параллелизма передачи, как найти в 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 раз медленнее, чем другой, он незначителен по сравнению со скоростью ввода-вывода на диске, выбрал версии, в которых у него меньше строк кода, что значительно ускоряет понимание и поддержку другими программисты. –

ответ

1

С TransferUtility documentation:

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

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

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

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

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

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

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

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

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

Смежные вопросы