我正在尝试使用Meteor构建一个数据可视化应用程序来可视化大型数据集。数据当前存储在CSV格式的数据文件中,大约为64MB。
我正在使用node-csv插件将此数据文件加载到Meteor Collection(下面的代码)中。但是每10k记录大约需要1分钟,按照这个速度大约需要1.5小时将整个文件加载到Collection中。在此期间,Meteor服务器无法响应Web请求。
这对我来说似乎异常缓慢。这是正常的吗? 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');
});
}
答案 0 :(得分:4)
即使你在流星环境之外这样做,一次加载一行数据也是非常低效的。我认为你想要的工具是mongoimport。
这可能不是很明显,但您不需要使用流星插入文档,以便将meteor与您的文档一起使用。
如果您的收藏中有0个文档(或者您的情况中有任何基本条件),您可以尝试从Meteor.startup
调用mongoimport。我没有试过这个,所以我不能说这是多么痛苦,但我想你可以打电话给child_process.spawn
来启动mongoimport。如果出于某些原因无效,您可以随时将其放入脚本中,并在执行meteor reset
时运行该脚本。
附注 - 我认为静态服务器资产的适当位置是private
目录。这也允许您使用Assets api来访问这些文件。