【问题标题】:Reading text from Amazon s3 stream从 Amazon s3 流中读取文本
【发布时间】:2013-02-24 13:52:37
【问题描述】:

我使用以下代码从 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
        }
    }                        
}

问题是:我可以得到更充分的方法来降低时间成本吗?

【问题讨论】:

    标签: c# amazon-s3 streamreader readline readfile


    【解决方案1】:

    .NET 中的 HTTPWebResponse 也存在类似的性能瓶颈,这可能是他们制作的 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”指定一个空代理 - 这实际上应该与上述配置更改相同,仅那个请求。

    【讨论】:

    • 请问.net core 的推荐修复是什么?
    【解决方案2】:

    或者你也可以使用这个功能,

        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);
        }
    

    【讨论】:

    • 效果很好! new StreamReader(response.ResponseStream).ReadToEnd()
    【解决方案3】:

    此函数用于计算文本文件中的字数。

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2017-09-06
      相关资源
      最近更新 更多