1

ASP.NET4.0を使用してアプリを構築しています。

エントリと呼ばれるテーブルがあります。エントリーはFacebook経由で高く評価することができます。いいねを介して並べ替える機能を実装したいので、各エントリのいいねの数を保存し、その列を使用して注文するというアプローチを取っています。問題は、いいねの数を取得するためのオーバーヘッドです。13エントリのデータを取得するのに4秒かかるので、今のように改善できると思います。これは長すぎます。

FBグラフAPIとJSON.NETを使用して応答を解析しています。次のコードでは、エントリタイプのリストがあり、エントリIDと組み合わせたアプリ設定を使用してエントリの同様のURLを取得しています。これは私がしていることです:

   foreach (Entry entry in entries)
        {
            int likes;
            try
            {
               // the url that is tied to the entry
               string url = "http://graph.facebook.com/?ids=" + Properties.Settings.Default.likeUrl + "?id=" + entry.EntryId;
               //open a WebClient and get the results of the url
                WebClient client = new WebClient();

            Stream data = client.OpenRead(url);
            StreamReader reader = new StreamReader(data);
            string s = reader.ReadToEnd();
            //parse out the response
            var json = JObject.Parse(s);
            //shares are how many likes the entry has
            likes = Convert.ToInt32(json.First.First.SelectToken("shares").ToString());

        }
        catch (Exception ex)
        {
            likes = 0;
        }

    }   

私が言ったように、この方法は非常に高価です。誰かが私がここで試みていることを行うためのより良い方法を提案することができれば、私は本当に助けていただければ幸いです。どうもありがとう!

4

2 に答える 2

2

方法、

ストリームまたはストリームリーダーを破棄していません。これは個々のパフォーマンスには役立たないかもしれませんが、後で速度が低下する可能性があります...また、変数の処理にもう少し注意が必要な並列拡張を使用してみてください。これは単なる例です。

編集:webclientも使い捨てであることを忘れました。それは毎回破棄する必要があります。そうしないと、しばらくの間接続にハングアップします。それは実際には少し役立つかもしれません。

private object locker;
private int _likes = 0;

private int Likes
{
    get
    {
        lock(locker)
        {
            return _likes;
        }
    }
    set
    {
        lock(locker)
        {
            _likes = value;
        }
    }
}


void MyMethod()
{
    Parallel.ForEach(entries, entry =>
    {
        using(WebClient client = new WebClient())
        using(Stream data = client.OpenRead(url))
        using(StreamReader reader = new StreamReader(data))
        {
        ....
        }
    }
}
于 2012-10-03T13:38:40.957 に答える
1

ループ内のアイテムごとに個別のAPI呼び出しを行うと、ネットワーク要求を行うオーバーヘッドが発生するため、処理が遅くなります。13項目すべてのいいねのクエリを1つのAPI呼び出しにバッチ処理することを検討しましたか?実行しているクエリで機能するかどうかは特にわかりませんが、FacebookAPIがクエリのバッチ処理のメソッドをサポートしていることは知っています。1つの出力が同じバッチ内の他のクエリに入るように、バッチを実行できます。グラフAPIを介してFQLクエリを作成するように切り替える必要がある場合があります。

API呼び出しをクライアントに移動し、javascriptAPIを使用して実装することも検討してください。これにより、API作業がユーザーのブラウザーにオフロードされ、アプリケーションのスケーリングが向上します。これを行わない場合は、少なくとも、非同期で呼び出しを行うというRobertの提案を検討する必要があります。

于 2012-10-03T14:45:36.310 に答える