请观察以下C#代码段:
dir.EnumerateFiles("*." + ext, searchOption)
.ToObservable()
.Select(file => GetBatchSource(file, ...))
.Merge(maxConcurrentFiles)
.Select(batch => WriteBatch(batch, ...))
.Merge(maxConcurrentBatches)
.DefaultIfEmpty()
.GetAwaiter()
.GetResult();
...
private static IObservable<Batch> GetBatchSource(FileInfo file, ...)
{ ... }
private static IObservable<Unit> WriteBatch(Batch batch, ...)
{ ... }
其中:
此代码将日志文件解析并转储到数据库中,同时只读取maxConcurrentFiles
个日志文件,并且不会向数据库写入maxConcurrentBatches
批次。
我的问题是maxConcurrentFiles
和maxConcurrentBatches
是固定值。当然,它们是工具的参数,但一旦给定它们就不会改变。
理想情况下,我希望在生成批次的速度(由maxConcurrentFiles
控制)与持久化(由maxConcurrentBatches
控制)之间取得完美平衡。但这个速度并不是一成不变的。
我已经运行了maxConcurrentFiles
和maxConcurrentBatches
等于1的代码,并注意到等待写入的生成批次的数量永远不会是常量。一开始它似乎爬到大约6批次并在5到6之间振荡。然后,由于某种原因,它爬到10(好像数据库正在减速)然后逐渐下降到0(现在文件读取逻辑正在减慢)向下,数据库空闲),在0和2之间振荡,然后再次爬升,依此类推。队列中等待的批次数量可能会攀升至47个!
无论如何,我需要一个解决方案,其中写入数据库的并发批量随着队列中批次数的增加而增加。同样,当数据库空闲等待批处理时,需要增加并发文件的数量。
你会如何实现这样的事情?