为什么将数据加载到Meteor Collection需要很长时间?

我正在尝试使用Meteor构build一个数据可视化应用程序来可视化大型数据集。 数据目前存储在CSV格式的数据文件中,大约为64MB。

我正在使用node-csv插件将此数据文件加载到Meteor集合(下面的代码)中。 但是,每10万条logging需要大约1分钟的时间,以这个速度大约需要1.5个小时才能将整个文件加载到集合中。 在此期间,Meteor服务器对Web请求没有响应。

这对我来说看起来exception缓慢。 这是正常的吗? meteor的目的不是为了处理大量的数据吗? 还是有更好的方式来做这个数据导入过程比我发现的方式?

var csv = Meteor.require('CSV'); var fs = Meteor.require('fs'); var path = Npm.require('path'); function loadData() { var basepath = path.resolve('.').split('.meteor')[0]; console.log('Loading data into Meteor...'); csv().from.stream( fs.createReadStream(basepath+'server/data/enron_data.csv'), {'escape': '\\'}) .on('record', Meteor.bindEnvironment(function(row, index) { if ((index % 10000) == 0) { console.log('Processing:', index, row); } Emails.insert({ 'sender_id': row[0], 'recipient_id': row[1], 'recipient_type': row[2], 'date': row[3], 'timezone': row[4], 'subject': row[5] }) }, function(error) { console.log('Error in bindEnvironment:', error); } )) .on('error', function(err) { console.log('Error reading CSV:', err); }) .on('end', function(count) { console.log(count, 'records read'); }); } 

即使你在meteor环境之外这样做,一次一行地加载你的数据实际上是效率低下的。 我想你想要的工具是mongoimport 。

这可能不是很明显,但是您不需要在meteor中插入文档,以便将meteor与文档一起使用。

当你的集合中有0个文档(或者任何基本条件对你的情况有意义)时,你可以尝试从Meteor.startup调用mongoimport。 我没有尝试过,所以我不能说这是多么的痛苦,但我想你可以调用child_process.spawn来启动mongoimport。 如果由于某种原因不起作用,您可以随时将其放入脚本中,并在meteor reset时运行该脚本。

附注 – 我相信你的静态服务器资产的适当位置是private目录。 这也可以让你使用Assets api来访问这些文件。