【问题标题】:Mass data load using Node.js使用 Node.js 加载海量数据
【发布时间】:2013-04-22 14:56:36
【问题描述】:

这是我对 Stack Overflow 的第一个问题,但过去 2 年我一直在使用 SO,它提供了丰富的信息。

我最近学习了 NodeJS,但我遇到了一个难题。我正在尝试找出使用 NodeJS 加载/插入大约 2000 行数据的最佳方法,如果可能的话,使用首选的 Async 方法。我必须从 API 中获取数据,然后获取 JSON 数据并将数据加载到 3 个表中,以便以后可以使用这些数据。该文件有 17 个 Country 对象,然后是 77 个 State 对象和大约 2000 个 Counties 对象。

我正在解析的 JSON 文件格式是:

[{Country:{
    Name: ...
    CountryId: ...
    States: {
      Name: ...
      StateId: ...
      Counties: {
        Name: ...
        CountyId:...
      }
     }
  },{Country+n:{
    Name: ...
    CountryId: ...
    States: {
      Name: ...
      StateId: ...
      Counties: {
        Name: ...
        CountyId:...
      }
     }
  }];

因此,使用我的 PHP 背景,我会立即在 JavaScript 中创建三个这样的函数:

function Country(data){
    for(var z in data){
      var country = data[z];
      InsertInCountryDB(country.CountryId, country.Name);
      State(Country.State);
    }
}

    function State(data){
        for(var z in data){
          var state = data[z];
          InsertInStateDB(state.StateId, state.Name);
          State(Country.State);
        }
    }

    function County(data){
        for(var z in data){
          var county = data[z];
          InsertInCountyDB(county.CountyId, county.Name);
        }
    }

我的第一次尝试是为每个对象创建一个事件,然后使用这些事件深入到对象内部,然后插入数据。我发现它可以很好地将国家和州的详细信息插入数据库,但是使用县数据,它会出错。

我不是在寻找我的问题的答案,而是在寻找帮助我摆脱三个同步功能而使用异步功能的编码技巧。

谢谢

【问题讨论】:

  • 哪个数据库?你试过什么?事件发射器?回调?
  • 2000 行应该非常快。我编写了脚本以将 7 百万条记录从多个文件插入到 mongo,而异步中没有问题。那你用什么数据库?
  • 我正在使用 postgres 数据库。我使用了 EventEmitters,但今天早上我想我可能错过了我最初应该使用监听器和事件的方式。我设法使用同步方法将所有数据输入系统。但是NodeJS的重点是异步编程,所以我想看看我是否可以重写代码以使用更好的方法。

标签: json node.js postgresql asynchronous


【解决方案1】:

2000 应该不会太糟糕。这听起来更像是 10000 次左右的插入。您的主要规则是将它们作为单个提交运行(如果您可以执行准备好的语句,那就更好了)并在最后提交。

现在,由于您的问题更多是在架构方面,并且假设您使用的是 PostgreSQL 9.1 或更高版本,(并且可以从源代码安装额外的编译扩展),我的建议会完全不同。

我会创建一个临时表(如果是 9.1,则需要从源扩展):

CREATE TEMPORARY TABLE upload_holding (payload json);

然后我只需将“行”作为 JSON 文档插入其中。然后,我将在 plv8js 中编写一个存储过程(您必须单独安装,可能从源代码安装,但如果您不想使用 Javascript,则可以使用 pl/perl 代替),它将处理 JSON 并提取每个部分.然后,您可以将这些函数链接在一起以将行作为集合处理并一起执行插入操作。

这里不可能有一个完整的工作示例,但考虑到使用 Perl 或 Javascript,您可以将每个实体以 JSON 形式提取并提取到一个元组中,然后将该元组进一步处理,您可以相当轻松地链接您插入到数据库内的 JSON 处理中。

这将是相似的,只是您的大部分功能都在数据库中,因此需要更少的规划开销来有效地利用。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 2017-11-25
    • 2021-05-05
    • 2015-08-22
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多