2013-02-24 2 views
2

Я использую следующий код для чтения текстового файла с Amazon S3 и обработки его по строкам. Этот код работает, но проблема в том, что он медленный.Чтение текста из потока Amazon s3

GetObjectRequest getObjRequest = new GetObjectRequest() 
    .WithBucketName(amazonSettings.BucketName) 
    .WithKey(_fileKey); 
using (AmazonS3 client = AWSClientFactory.CreateAmazonS3Client(
    amazonSettings.AccessKey, 
    amazonSettings.SecretAccessKey)) 
using (GetObjectResponse getObjRespone = client.GetObject(getObjRequest)) 
using (Stream amazonStream = getObjRespone.ResponseStream) 
{       
    StreamReader amazonStreamReader = new StreamReader(amazonStream); 
    tempGsContact = new GSContact(); 
    while ((_fileLine = amazonStreamReader.ReadLine()) != null) 
    { 
     if (_fileLine.Equals("END:VCARD")) 
     { 
      // Make process 1 
     } 
     else if (!_fileLine.Equals(string.Empty)) 
     { 
      //Make process 2 
     } 
    }       
} 

Вопрос: могу ли я получить более достаточный способ сократить временную стоимость?

ответ

3

Подобное узкое место производительности в HTTPWebResponse в .NET, вероятно, является тем, что класс AmazonS3, который они создали, является обертыванием.

Это вызвано объект занимает много времени, чтобы разрешить настройки прокси-сервера, есть несколько возможных решений, перечисленных here, но самый простой вариант может добавить следующие строки в ваш файл app.config:

<system.net> 
    <defaultProxy enabled="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

в качестве альтернативы можно заменить вызов здесь:

AWSClientFactory.CreateAmazonS3Client(amazonSettings.AccessKey, amazonSettings.SecretAccessKey) 

с призывом к overload, который принимает третий параметр «AmazonS3Config», где вы можете указать нулевой прокси через «AmazonS3Config.ProxyHost = NULL» - который должен эффективно совпадают с приведенным выше изменением конфигурации только для этого запроса.

0

Эта функция предназначена для подсчета количества слов в текстовом файле.

private int WordCount(string awsBucketName, string awsFilePath, string wordForSearch) 
    { 
     string line =string.Empty; 
     int counter = 0; 
     if ((cloudKaseClient != null) & (token == tokenCfg)) 
     { 
      var request = new GetObjectRequest() 
      { 
       BucketName = awsBucketName, 
       Key = awsFilePath 
      }; 
      using (var response = cloudKaseClient.GetObject(request)) 
      { 
        StreamReader reader = new StreamReader(response.ResponseStream); 
        while ((line = reader.ReadLine()) != null) 
        { 
         counter += line.Split(' ').Where(t => t.ToString().ToLower().Contains(wordForSearch.ToLower())).Count(); 
        } 
        reader.Close();    
      } 
     } 
     return counter; 
    } 
0

ИЛИ Вы можете использовать эту функцию также,

private static void ReadS3Object(AmazonS3Client client) 
    { 
     GetObjectRequest request = new GetObjectRequest(); 

     request.WithBucketName(BUCKET_NAME); 
     request.WithKey(S3_KEY); 

     GetObjectResponse response = client.GetObject(request); 

     StreamReader reader = new StreamReader(response.ResponseStream); 

     String content = reader.ReadToEnd(); 

     Console.Out.WriteLine("Read S3 object with key " + S3_KEY + " in bucket " + BUCKET_NAME + ". Content is: " + content); 
    }