4

次のコードを使用して、Amazon S3 からテキスト ファイルを読み取り、1 行ずつ処理します。このコードは機能しますが、問題は遅いことです。

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

問題は、時間コストを削減するためのより十分な方法を手に入れることができるかということです。

4

3 に答える 3

4

.NET の HTTPWebResponse にも同様のパフォーマンスのボトルネックがあります。これはおそらく、彼らが作成した AmazonS3 クラスがラップしているものです。

これは、オブジェクトがプロキシ設定を解決するのに時間がかかることが原因です。ここにリストされているいくつかの潜在的な解決策がありますが、最も簡単なオプションは、app.config ファイルに次を追加することです。

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

または、ここで呼び出しを置き換えることもできます。

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

「AmazonS3Config」の 3 番目のパラメータを受け入れるオーバーロードを呼び出します。ここで、「AmazonS3Config.ProxyHost = null」を介して null プロキシを指定できます。これは、そのリクエストのみに対する上記の構成変更と事実上同じである必要があります。

于 2013-02-24T15:50:43.860 に答える
1

または、この機能も使用できます。

    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);
    }
于 2013-11-28T10:35:08.957 に答える
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;
    }
于 2013-11-28T10:08:56.620 に答える