c# – PLINQ查询给出溢出异常
发布时间:2020-12-15 08:40:33 所属栏目:百科 来源:网络整理
导读:我正在运行PLINQ查询,如下所示: ParallelQuerystring winningCombos = from n in nextComboMaker.GetNextCombo() .AsParallel().WithCancellation(_cancelSource.Token) where ComboWasAWinner(n) select n;ConcurrentBagstring wins = new ConcurrentBagst
我正在运行PLINQ查询,如下所示:
ParallelQuery<string> winningCombos = from n in nextComboMaker.GetNextCombo() .AsParallel().WithCancellation(_cancelSource.Token) where ComboWasAWinner(n) select n; ConcurrentBag<string> wins = new ConcurrentBag<string>(); foreach (var winningCombo in winningCombos) { wins.Add(winningCombo); if (wins.Count == _maxWinsAllowed) break; } GetNextCombo方法只返回下一个字母和数字组合,可能达到数十亿/万亿. 现在,当我选择一个大于Int32允许大小的组合范围时抛出异常,它总是在它运行的组合计数器为2147483584时抛出. 我已经确定GetNextCombo中没有任何东西通过创建一个假组合来每次返回(做一个收益率返回“234gf24fa23 ……”等) LINQ抛出异常: System.AggregateException was unhandled by user code Message=One or more errors occurred. Source=System.Core StackTrace: at System.Linq.Parallel.QueryTaskGroupState.QueryEnd(Boolean userInitiatedDispose) at System.Linq.Parallel.MergeExecutor`1.Execute[TKey](PartitionedStream`2 partitions,Boolean ignoreOutput,ParallelMergeOptions options,TaskScheduler taskScheduler,Boolean isOrdered,CancellationState cancellationState,Int32 queryId) at System.Linq.Parallel.PartitionedStreamMerger`1.Receive[TKey](PartitionedStream`2 partitionedStream) at System.Linq.Parallel.ForAllOperator`1.WrapPartitionedStream[TKey](PartitionedStream`2 inputStream,IPartitionedStreamRecipient`1 recipient,Boolean preferStriping,QuerySettings settings) at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.ChildResultsRecipient.Receive[TKey](PartitionedStream`2 inputStream) at System.Linq.Parallel.WhereQueryOperator`1.WrapPartitionedStream[TKey](PartitionedStream`2 inputStream,QuerySettings settings) at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.ChildResultsRecipient.Receive[TKey](PartitionedStream`2 inputStream) at System.Linq.Parallel.ScanQueryOperator`1.ScanEnumerableQueryOperatorResults.GivePartitionedStream(IPartitionedStreamRecipient`1 recipient) at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.GivePartitionedStream(IPartitionedStreamRecipient`1 recipient) at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.GivePartitionedStream(IPartitionedStreamRecipient`1 recipient) at System.Linq.Parallel.QueryOperator`1.GetOpenedEnumerator(Nullable`1 mergeOptions,Boolean suppressOrder,Boolean forEffect,QuerySettings querySettings) at System.Linq.Parallel.ForAllOperator`1.RunSynchronously() at StockWiz.Library.PLINQArrayProcessor.DoProcessing() in C:UsersdadDocumentsBitBucketstockwiz_clonestockwizStockWiz.LibraryPLINQArrayProcessor.cs:line 50 at System.Threading.Tasks.Task.Execute() InnerException: System.OverflowException Message=Arithmetic operation resulted in an overflow. Source=System.Core StackTrace: at System.Linq.Parallel.PartitionedDataSource`1.ContiguousChunkLazyEnumerator.MoveNext(T& currentElement,Int32& currentKey) at System.Linq.Parallel.WhereQueryOperator`1.WhereQueryOperatorEnumerator`1.MoveNext(TInputOutput& currentElement,TKey& currentKey) at System.Linq.Parallel.ForAllOperator`1.ForAllEnumerator`1.MoveNext(TInput& currentElement,Int32& currentKey) at System.Linq.Parallel.ForAllSpoolingTask`2.SpoolingWork() at System.Linq.Parallel.SpoolingTaskBase.Work() at System.Linq.Parallel.QueryTask.BaseWork(Object unused) at System.Threading.Tasks.Task.Execute() InnerException: 我想知道是否有任何我可以做的事情来改变这个查询不溢出,我做任何事情的顺序,等等.也许没有linq查询做的地方和选择,虽然我试过这个: var query = nextComboMaker.GetNextCombo().AsParallel(); query.ForAll(x => if(ComboWasAWinner(x) wins.Add(x) ); 还是一样的溢出. 解决方法
您应该能够通过使用自定义分区程序来解决这个问题.在这种情况下,PLINQ选择的默认分区程序仅支持int-range项目数.
有关如何执行此操作,请参阅http://msdn.microsoft.com/en-us/library/dd997416.aspx. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |