为什么将数据加载到流星集合中需要这么长时间

Why does loading data into a Meteor Collection take so long?

本文关键字:长时间 集合 数据 加载 流星 为什么      更新时间:2023-09-26

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

我正在使用node-csv插件将此数据文件加载到Meteor集合中(下面的代码)。 但是每 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');
    });
}

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

这可能并不明显,但您无需将文档与 meteor 一起插入即可将 meteor 与文档一起使用。

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

旁注 - 我相信静态服务器资产的合适位置是private目录。这还允许您使用资产 api 访问这些文件。