Android RxJava/Kotlin - 将大量数据映射到网络调用
Android RxJava/Kotlin - map large set of data to network calls
我正在尝试实现一个 Android 应用程序,它需要从后端服务获取大量数据并将其保存到数据库以供以后处理。
下面的代码描述了这个过程:
itemsService
.getAllItemIds() //This returns Single<List<Int>> from backend
.subscribeOn(Schedulers.io())
.subscribe({
Observable.fromIterable(it)
.map({
itemsService
.getItemById(it) //This gets one item details from backend
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//Add item details to db
}, {
//Some error
})
})
}, {
//Some error
})
我获得了一个 ID 列表,然后将这些 ID 中的每一个映射到网络调用以获取完整的对象。
这适用于包含 10 个项目的测试集,但生产集包含超过 50 000 个 ID。它最初可以运行,保存项目,但大约 5-10% 时它会停止运行并且应用程序会死掉。
我假设这里的原因是 Rx 保持源和映射值之间的引用。
我的问题是:有没有办法 "pool" 源排放量一次达到 10 个?或者可能还有其他一些我不知道的机制?
你没有提到 "grinds to a halt" 的确切含义,但在 50,000 个项目的实际情况下你会内存不足是有道理的,因为你基本上会尝试一次创建 50,000 个线程来获取每个项目的详细信息。
此外,您不是使用运算符链接 Observable
,而是在 subscribe
/map
处创建嵌套链,您可以阅读 为什么不应该t.
关于一次将工作限制为 10 个,有一个 flatMap
过载,最后它可能看起来像这样:
itemsService
.getAllItemIds() //This returns List<Int> from backend
.flatMapIterable { t -> t }
.flatMap({
itemsService
.getItemById(it) //This gets one item details from backend
.subscribeOn(Schedulers.io())
}, 10) //limit flat map parallelism by desired value
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//Add item details to db
}, {
//Some error
})
我正在尝试实现一个 Android 应用程序,它需要从后端服务获取大量数据并将其保存到数据库以供以后处理。
下面的代码描述了这个过程:
itemsService
.getAllItemIds() //This returns Single<List<Int>> from backend
.subscribeOn(Schedulers.io())
.subscribe({
Observable.fromIterable(it)
.map({
itemsService
.getItemById(it) //This gets one item details from backend
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//Add item details to db
}, {
//Some error
})
})
}, {
//Some error
})
我获得了一个 ID 列表,然后将这些 ID 中的每一个映射到网络调用以获取完整的对象。
这适用于包含 10 个项目的测试集,但生产集包含超过 50 000 个 ID。它最初可以运行,保存项目,但大约 5-10% 时它会停止运行并且应用程序会死掉。
我假设这里的原因是 Rx 保持源和映射值之间的引用。
我的问题是:有没有办法 "pool" 源排放量一次达到 10 个?或者可能还有其他一些我不知道的机制?
你没有提到 "grinds to a halt" 的确切含义,但在 50,000 个项目的实际情况下你会内存不足是有道理的,因为你基本上会尝试一次创建 50,000 个线程来获取每个项目的详细信息。
此外,您不是使用运算符链接 Observable
,而是在 subscribe
/map
处创建嵌套链,您可以阅读
关于一次将工作限制为 10 个,有一个 flatMap
过载,最后它可能看起来像这样:
itemsService
.getAllItemIds() //This returns List<Int> from backend
.flatMapIterable { t -> t }
.flatMap({
itemsService
.getItemById(it) //This gets one item details from backend
.subscribeOn(Schedulers.io())
}, 10) //limit flat map parallelism by desired value
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//Add item details to db
}, {
//Some error
})