1

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

我正在使用 node-csv 插件将此数据文件加载到流星集合中(代码如下)。但是每 10k 条记录大约需要 1 分钟,按照这个速度,将整个文件加载到集合中大约需要 1.5 小时。在此期间,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');
    });
}
4

1 回答 1

4

即使您在流星环境之外执行此操作,一次加载一行数据也确实效率低下。我认为您想要的工具是mongoimport

这可能不是很明显,但是您不需要使用流星插入您的文档以便在您的文档中使用流星。

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

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

于 2013-10-23T20:21:30.067 回答