使用Node.js加载海量数据

时间:2013-04-29 02:02:41

标签: json node.js postgresql asynchronous

这是我关于Stack溢出的第一个问题,但我在过去的两年里一直在使用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 backround,我会立即在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);
        }
    }

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

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

由于

1 个答案:

答案 0 :(得分:0)

2000年应该不会太糟糕。这听起来更像10000插件左右。您的大规则是将它们作为单个提交运行(如果您可以执行预处理语句,甚至更好)和最后提交。

既然你的问题更多的是在架构方面,假设你正在使用PostgreSQL 9.1或更高版本,(并且可以从源代码安装额外的编译扩展),我的建议会有很大不同。

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

CREATE TEMPORARY TABLE upload_holding (payload json);

然后我会在那里插入“行”作为JSON文档。然后我会在plv8js中编写一个存储过程(你必须单独安装,可能来自源代码,但如果你不想在Javascript中工作,你可以使用pl / perl)来处理JSON并提取每个部分。 。然后,您可以将这些函数链接在一起,将这些行作为集合进行处理,并将插入内容组合在一起。

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

除非您的大多数功能都在数据库中,因此需要更少的计划开销才能有效利用。