0

500 人以上の Facebook の友達を MongoDB に保存するのに長い時間がかかっています。挿入方法を貼り付けます。

models.js:

Friends = new Meteor.Collection('friends');
Friend = {
set : function(owner, friend) {
    var user_id = get_user_by_uid(friend['uid']);
    return Friends.update({uid: friend['uid'], owner: owner}, {$set:{
        name : friend['name'],
        pic_square : 'https://graph.facebook.com/'+friend['uid']+'/picture?width=150&height=150',
        pic_cover : friend['pic_cover'],
        uid : friend['uid'],
        likes_count : friend['likes_count'],
        friend_count : friend['friend_count'],
        wall_count : friend['wall_count'],
        age : get_age(friend['birthday_date']),
        mutual_friend_count : friend['mutual_friend_count'],
        owner : owner,
        user_id : user_id ? user_id['_id'] : undefined
    }}, {upsert: true});
}
}

サーバー.js:

// First get facebook list of friends   
friends = friends['data']['data'];

_.each(friends, function(friend){
    Friend.set(user_id, friend);
});

ユーザーが 2 人以上になると負荷が高くなり、データベースへの挿入に時間がかかります。ここで何を変更すればよいですか?

4

1 に答える 1

4

パフォーマンスが悪いのには、2 つの理由があると思います。

まず、クライアントでminimongoパフォーマンスではなく、パフォーマンスを経験mongodbしています。minimongo索引付けできないため、upsertコストがO(n^2)高くなります。データベースのサイズが高くなります。if (Meteor.isSimulation) return;データベースを更新する直前に、ステートメントをモデルに追加するだけです。

サンプル コードを見て、コードを少し整理する方法を確認Friend.set(user_id, friend)してくださいmodel.js。次に、呼び出しを実行しているサーバーではなく、呼び出しをシミュレートしているクライアントとして検出された場合は、エスケープする必要があります。

第二に、キーをキーにせずにキーを使用uidして好きです。ownerサーバーの起動コードに を追加しFriends._ensureIndex({uid:1, owner:1})ます。

これがうまくいかない場合は、Facebook へのクエリが何らかの方法でレート制限されている可能性があります。

レート制限されている場合に表示されるエラー メッセージについては、https://stackoverflow.com/a/8805436/1757994を参照してください。

ほとんどの場合、彼らはあなたがやっているようにグラフをコピーすることを望んでいません。とにかく非常に急速に古くなるため、グラフをまったくコピーせず、使用ベースでのみデータを取得することを検討することをお勧めします。

于 2013-01-22T17:20:33.537 に答える