Rx java 如何压缩多个观测值(1kk),而不在阵列中预先分配它们
我有一个函数,表示在db中的单个异步插入:Rx java 如何压缩多个观测值(1kk),而不在阵列中预先分配它们,rx-java,reactive-programming,rxjs,Rx Java,Reactive Programming,Rxjs,我有一个函数,表示在db中的单个异步插入: function insertInDatabaseRx(data) { return Rx.Observable.create(function (observer) { db.insert(data, function (err) { if (err) { observer.onError(err); } else {
function insertInDatabaseRx(data) {
return Rx.Observable.create(function (observer) {
db.insert(data, function (err) {
if (err) {
observer.onError(err);
} else {
observer.onCompleted();
}
});
});
}
我需要做大量插入(1kk+次),并在完成之后做一些动作。我目前的执行情况:
var someLongArray = ...;
var massInsertion = [];
for (var i = 0; i < someLongArray.length; i++) {
massInsertion.push(insertInDatabaseRx(someLongArray[i].data);
}
Rx.Observable.zip(massInsertion)
.subscribe(
function (x) {
logger.debug('Next: %s', x);
},
function (e) {
logger.error('Error: %s', e);
},
function () {
//all done
logger.info('all save done, terminating ... ');
process.exit();
});
var someLongArray=。。。;
var massInsertion=[];
for(var i=0;i
这是可行的,但我认为预先分配观察值数组并不能有效地利用资源(cpu/mem):
var massInsertion = [];
for (var i = 0; i < someLongArray.length; i++) {
massInsertion.push(insertInDatabaseRx(someLongArray[i].data);
}
var massInsertion=[];
for(var i=0;i
如何在不预先分配观察值数组的情况下更有效地执行此任务?您可以使用forkJoin()
function insertAll(){
var rxResult=insertinadabaserx(someLongArray[0]。数据);
for(var i=1;i
您可以使用forkJoin()
function insertAll(){
var rxResult=insertinadabaserx(someLongArray[0]。数据);
for(var i=1;i
我注意到的第一件事是,InsertInDatabasex
不遵守可观察契约。在调用OneError
后,不应该发出onCompleted
。一个否则的就是修复该位所需的一切。@DaveModen谢谢!数据从哪里来?它是从数组来的吗?你确定你的数据库是这样做的吗没有大容量插入操作?@paulpdaniels是的,它来自数组,db没有大容量插入。对我来说,阻止插入是很好的,因为它运行在应用程序出口上,但db没有同步api,同样在rxjs中,我没有看到类似rxjava的。ToBlock
方法。我注意到的第一件事是InsertInDatabasex
不遵守可观察契约。在调用onError
后,不应发出onCompleted
。修复该位只需一个或即可。@DaveModen谢谢!数据从哪里来?它来自数组吗?你确定你的数据库没有批量插入操作吗?@paulpdaniels是的,这是com从数组和db中删除数据并没有大容量插入。对我来说,阻塞插入是很好的,因为它运行在应用程序出口上,但db没有同步api,同样在rxjs中,我也没有看到类似rxjava的。ToBlock
方法。
function insertAll() {
var rxResult = insertInDatabaseRx(someLongArray[0].data);
for (var i = 1; i < someLongArray.length; i++) {
rxResult = rxResult.forkJoin(
insertInDatabaseRx(someLongArray[i].data),
function (result1, result2) {
return result1 + result2;
});
}
rxResult.map(...);
}