Проблема с производительностью при репликации огромного набора данных в Cloudant и в PouchDB - PullRequest
0 голосов
/ 18 января 2019

Я работаю над проектом, который включает в себя репликацию localDB в cloudant. У меня есть некоторые проблемы с этим:

1. Поскольку я использую websql в качестве адаптера и nodejs на серверной части приложения для Android, мне нужно использовать префикс для перехода базы данных в каталог данных, чтобы иметь возможность открыть файл db. Из-за этого, когда я пытаюсь выполнить репликацию в облачную или любую другую удаленную базу данных, совместимую с pocuhDB, она не работает, если я не использую pouchdb, replication (local, remote, opts); Таким образом, репликация возможна, но есть ли способ сделать репликацию возможной с помощью фокстона, а не жесткого кодирования?

Пример

 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. Первоначальная репликация очень медленная для документов 100 КБ (без вложений размером 100 МБ), для синхронизации требуется около 1 часа 45 минут (через API репликации pouchDB). Я прошел через проблемы и попытался реализовать поток репликации pouchDB и использовал репликацию потока памяти (dump / load). Изменение 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)
  });

Может кто-нибудь предложить мне эффективный способ для этого?

Любая помощь или предложение будет оценено

...