我正在使用rx distinct操作符来基于长时间运行的进程中某个特定的键过滤外部数据流。假设将会收到很多不同的键,这样做会导致内存泄漏吗?rx distinct操作符如何跟踪之前接收到的键?我应该使用带有持续时间选择器的groupbyuntil吗?
Observable.Distinct
使用HashSet
内部。内存使用量大致与遇到的唯一键数成比例。(据我所知,约为30*n字节)
GroupByUntil
与Distinct
非常不同。
GroupByUntil
(很好地)进行分组,而Distinct
过滤流中的元素。
不确定预期的用途,但如果您只想过滤连续的相同元素,则需要使用Observable.DistinctUntilChanged
,其内存占用与键数无关。
Observable.Create<MyPoco>(
observer =>
{
var distinctPocos = new BehaviorSubject<IObservable<MyPoco>>(pocos.Distinct(x => x.Id));
var timerSubscription =
Observable.Timer(
new DateTimeOffset(DateTime.UtcNow.Date.AddDays(1)),
TimeSpan.FromDays(1),
schedulerService.Default).Subscribe(
t =>
{
Log.Info("Daily reset - resetting distinct subscription.");
distinctPocos.OnNext(pocos.Distinct(x => x.Id));
});
var pocoSubscription = distinctPocos.Switch().Subscribe(observer);
return new CompositeDisposable(timerSubscription, pocoSubscription);
});
然而,我倾向于同意James World在上面的评论中提到的使用内存分析器进行测试,以检查内存是否确实是一个问题,然后再引入潜在的不必要的复杂性。如果您正在累积32位整数作为键,则在大多数平台上,在遇到内存问题之前,您将拥有数百万个唯一项目。例如,262144个32位整数键将占用1兆字节。根据您的情况,可能会在此之前长时间重置进程。