我收集了6000个股票的10M文件,股票名称已编入索引.当我订阅一个新的股票时,流星挂起超过10秒钟,以获得该股票的约3000份文件.在订购了几只股票后,流星也会以100%的CPU使用率挂起.同步"大"系列时,流星看起来很慢.实际上我的应用程序只是只读.我想知道是否有办法加速只读客户端的流星?我也想知道为每个股票创建一个单独的集合有帮助吗?
Jos*_*ulf 13
Meteor正在将整个数据集推送到您的客户端.
您可以通过删除autopublish包关闭自动发布:
meteor remove autopublish
然后为您的客户创建特定的特定订阅.
订阅时,您可以将会话变量作为参数传递,因此在客户端上执行以下操作:
sub = new Meteor.autosubscribe(function(){
Meteor.subscribe('channelname', getSession('filterval'));
}
在服务器上,您使用参数来过滤发送到客户端的结果集,这样您就不会一次性管理所有内容.您可以使用过滤器以某种方式对数据进行分段.
Meteor.publish('channelname', function(filter){
return Collection.find({field: filter});
}
现在,每当您使用setSession('filterval', 'newvalue');订阅更改客户端上的filterval时,将自动更改,并且新数据集将发送到客户端.
您可以使用此方法来控制向客户端发送的数据量和数据量.
正如另一张海报所说,你真的不得不问这是否是这项工作的最佳工具.Meteor适用于在(可能)两个方向上实时更新的相对较小的数据集.它经过了大量优化,并为该用例提供了大量脚手架.
对于另一个用例(例如只读的大数据集),它可能没有意义.它有很多开销,提供了您不会使用的功能,并且您将编写代码以获得所需的功能.
Chr*_*itz 12
我正在努力解决同样的问题.在我的情况下,我只需要同步~3000条记录,总共约30KB.经过数周的尝试,我终于意识到同步不是问题,但似乎同步时发生的LiveHTML更新.
通过在初始页面加载期间禁用模板更新,我能够将300页(已过滤)记录的页面加载从10秒减少到所有3000条记录的不到2秒.我通过向定义模板内容的函数添加条件来实现这一点:
之前(服务器发布的300条记录加载10页):
Template.itemlist.items = function () {
return Item.find({type: 'car'},
{sort: {start: -1},
limit: 30});
};
Run Code Online (Sandbox Code Playgroud)
要(服务器发布的3000条记录的2s页面加载):
Template.itemlist.items = function () {
if (Session.get("active")) {
return Item.find({type: 'car'},
{sort: {start: -1},
limit: 30});
} else {
return [];
}
};
Run Code Online (Sandbox Code Playgroud)
为了在加载数据后"激活"会话,我添加了:
Deps.autorun(function () {
Meteor.subscribe("Item",
{
onReady: function() {
Session.set("active", true);
}
});
});
Run Code Online (Sandbox Code Playgroud)
虽然这是一个规模问题,可能会有所改进; 应该注意的是,您使用了错误的技术来完成任务,因为Meteor用于客户端之间的交互,而不是用于检索大量只读时间敏感数据.虽然状态跟踪屏幕可能仍然有些意义,但是大量的时间关键数据肯定不会......
整个Meteor堆栈在任何本机堆栈中的简单实现上引入了极大的开销; 老实说,我甚至会考虑Java或C#引入的开销,并在选择PHP和C++等低级语言时要三思而后行.像Ruby,Python,Node.js等语言真的是一个不同的故事; 它们是为快速原型制作而设计的,但就延迟/吞吐量而言,它们由于JIT它们所需的开销而落后,而不是忘记开销一些非原生的做事方法.
TL; DR:使用合适的工具完成工作,否则你会割伤手指......