在Cloudant与PouchDB之间复制大量数据集时出现性能问题

时间:2019-01-18 07:55:58

标签: javascript node.js couchdb pouchdb cloudant

我正在从事一个项目,其中包括将localDB复制到cloudant。我有一些问题:

1。由于我使用websql作为适配器,并且使用android应用程序的后端上的nodejs,因此我需要使用前缀将数据库导航到数据目录,以便能够打开db文件。因此,当我尝试复制到cloudant或任何其他远程pocuhDB兼容数据库时,除非我使用pouchdb,replication(local,remote,opts),否则它将无法正常工作;这样可以进行复制,但是有什么方法可以使从fauxton进行复制而不是硬编码?

样本

 let opts = {live:true,retry:true},
       Promise = require('bluebird'),
       fs = require('fs'),
       path = require('path'),
       express = require('express'),
       app = express(),
       PouchDB = require('pouchdb-core'),
       replicationStream = require('pouchdb-replication-stream'),
       memoryStream = require('memorystream'),
       log = path.join(cordova.app.datadir(),"log.txt"),
       backup = path.join(cordova.app.datadir(),"backup.txt"),
       prefix = path.join(cordova.app.datadir(),"db"),
       pouchdb = PouchDB.plugin(require('pouchdb-adapter-node-websql')).plugin(require('pouchdb- 
       adapter-http')).plugin(require('pouchdb-mapreduce')).plugin(require('pouchdb- replication')).plugin(replicationStream.plugin);
       pouchDB = pouchdb.defaults({prefix:prefix});
  let pouchHandle = require('express-pouchdb')(pouchDB,{logPath:log});
       PouchDB.adapter('writableStream',replicationStream.adapters.writableStream);
  let stream = new memoryStream();

 let config = pouchHandle.couchConfig;
       app.use(cors(config));
       console.log("Config file set");
       app.use('/',pouchHandle);
       server = app.listen(port).on('error',console.log);
 let db = new pouchDB('posdemo',{adapter:'websql'});
       db.changes({live: true, since:'now'}).on('change',console.log);
       pouchdb.replicate(remote,db,opts);
       pouchdb.replicate(db,remote,opts);

2。对于100k(没有附件大小为100mb)的文档,初始复制非常慢,大约需要1小时45分钟才能同步(通过pouchDB的复制API)。我经历了这些问题,并尝试实现pouchDB复制流并使用了内存流复制(转储/加载)。更改batch_limit和batch_size大约花费了45分钟。有没有一种方法可以使初始复制更快,更有效。由于文档数量可能会更高。

3。当我使用db.dump(stream)时,假设文档数量为35000,它只会转储2800个文档。这是我的转储代码:

 var backup = path.join(cordova.app.datadir(),"backup.txt");
 var ws = fs.createWriteStream(backup);
  db.dump(ws,{since:0}).then(function(res){
    console.log(res);
  }).catch(function(err){
    console.log(err)
  });

有人可以建议我这样做的有效方法吗?

任何帮助或建议将不胜感激

0 个答案:

没有答案