Meteor应用程序在客户端加载时卡在100%CPU上-如何修复?
当我在客户端加载应用程序的某些页面时,我的meteor应用程序已经达到了服务器上100%的cpu。它会导致应用程序为其他客户端挂起。我怎样才能修好它 我怀疑我可以通过更有效地发布或订阅这些特定页面来提高性能。但是,我不确定在发布函数中进行更多计算以减少发送到客户端的字段是否有帮助。当发送的数据大小减小时,发送数据前的计算次数增加。我应该优化更多的计算和更少的数据还是更少的计算和更多的数据?具体来说,我用什么标准来决定 我的发布功能:Meteor应用程序在客户端加载时卡在100%CPU上-如何修复?,meteor,Meteor,当我在客户端加载应用程序的某些页面时,我的meteor应用程序已经达到了服务器上100%的cpu。它会导致应用程序为其他客户端挂起。我怎样才能修好它 我怀疑我可以通过更有效地发布或订阅这些特定页面来提高性能。但是,我不确定在发布函数中进行更多计算以减少发送到客户端的字段是否有帮助。当发送的数据大小减小时,发送数据前的计算次数增加。我应该优化更多的计算和更少的数据还是更少的计算和更多的数据?具体来说,我用什么标准来决定 我的发布功能: Meteor.publish('userdata', func
Meteor.publish('userdata', function(id) {
if (!this.userId) return [];
var user = Meteor.users.findOne(this.userId);
if (!user) return [];
if (isStaff(this.userId)) user = Meteor.users.findOne(id);
var tasks;
var emails = [];
var network = user.users ? [user.users] : [];
var meals;
if (isStaff(this.userId) && this.userId === id) { //staff looking at own profile
tasks = Tasks.find({users: this.userId, status: "active"}, {sort: { taskName: 1 } });
emails = Emails.find({staffId: id});
meals = Meals.find({userId: this.userId});
}
else { //staff looking at other profiles
meals = Meals.find({userId: id});
var completedTasks = [];
if (user.userTaskStatus) {
completedTasks = user.userTaskStatus.map(function (thisTaskStatus) {
if (thisTaskStatus.status !== "incomplete") return thisTaskStatus.taskId;
});
}
var allUserTasks = Tasks.find({users: user._id});
var showTaskIds = [];
allUserTasks.forEach(function (thisTask) {
if (!thisTask.prereqs) showTaskIds.push(thisTask._id);
else {
var prereqs = thisTask.prereqs;
var pushTaskFlag = true;
for(var i=0; i<prereqs.length; i++)
if (completedTasks.indexOf(prereqs[i]) < 0) {
pushTaskFlag = false;
break;
}
if (pushTaskFlag) showTaskIds.push(thisTask._id);
}
});
tasks = Tasks.find({_id: {$in: showTaskIds}, visible: true, status: "active"}, {sort: { taskName: 1 } });
var network = user.users ? user.users.push(id) : [id];
if (isStaff(this.userId)) emails = Emails.find({userId: {$in: network}}, {sort: {date: -1}});
}
network.push(user._id);
var calls = Calls.find({$or: [{to:user.phone},{from:user.phone}] });
var callStaffIds = calls.map(function (thisCall) {
return thisCall.staff;
});
var callNoteIds = calls.map(function (thisCall) {
return thisCall.noteId;
});
var notes = Notes.find({
$or:[
{userId: this.userId},
{noteId: {$in: callNoteIds}}
]
});
var noteStaffIds = notes.map(function (thisNote) {
return thisNote.staff;
});
var allUserIds = network.concat(callStaffIds, noteStaffIds);
var groups = [];
if (user.groups) groups = user.groups;
return [
Meteor.users.find({_id: {$in: allUserIds}}, {fields: {services: 0}}),
tasks,
Groups.find({_id: {$in: groups}}, {sort: { groupName: 1 } }),
emails,
calls,
notes,
meals
];
});
Meteor.publish('userdata',函数(id){
如果(!this.userId)返回[];
var user=Meteor.users.findOne(this.userId);
如果(!user)返回[];
if(isStaff(this.userId))user=Meteor.users.findOne(id);
var任务;
var=[];
var网络=user.users?[user.users]:[];
营养餐;
if(isStaff(this.userId)&&this.userId==id){//员工查看自己的个人资料
tasks=tasks.find({users:this.userId,状态:“active”},{sort:{taskName:1}});
emails=emails.find({staffId:id});
膳食=膳食.find({userId:this.userId});
}
else{//查看其他配置文件的员工
膳食=膳食。查找({userId:id});
var completedTasks=[];
if(user.userTaskStatus){
completedTasks=user.userTaskStatus.map(函数(thisTaskStatus){
如果(thisTaskStatus.status!=“未完成”),则返回thisTaskStatus.taskId;
});
}
var allUserTasks=Tasks.find({users:user.\u id});
var showTaskIds=[];
allUserTasks.forEach(函数(ThistTask){
如果(!thisTask.prereqs)显示taskids.push(thisTask.\u id);
否则{
var prereqs=thisTask.prereqs;
var pushTaskFlag=true;
对于(var i=0;i你是否真的有任何具体数据作为你假设的基础?只有当我在浏览器中加载web应用程序的某些页面时,cpu才会峰值。与这些页面相关联的发布函数有很多集合。查找和每个循环对我来说,从流星的角度来看,这些代码一点都不正确。好吧,你应该这样做对每个集合进行发布,而不是发布各种数组和游标的数组。理想情况下,在Mongo中,您会有子集合。例如,
调用
集合将有一个名为注释
的字段,而不是一个单独的注释
集合。这样,您只需发布调用,就可以得到返回的注释。哟您可以使用下划线之类的内容从调用数组中提取并展平注释。var calls=calls.find().fetch()
和var notes=uuz(calls).chain().pull('notes').flatte().value()
@MichaelMason谢谢你的建议。我会尝试一下。仅供参考,返回集合数组没有错。游标,尽管这可能是我的问题的一部分。@FullStack啊,那么我学到了一些新东西!:)