当前位置: 首页 > 知识库问答 >
问题:

使用C#从GdriFS下载大文件会出现排序超出内存限制错误

慕鹏
2023-03-14

我正在使用以下代码从 GridFS 下载文件。

var stream = await this.gridFsBucket.OpenDownloadStreamAsync(new ObjectId(fileId));

我得到以下错误:

MongoDB.Driver.MongoCommandException: Command find failed: Executor error during find command :: caused by :: Sort exceeded memory limit of 33554432 bytes, but did not opt in to external sorting..
   at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
   at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, ICoreSession session, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.RetryableReadOperationExecutor.ExecuteAsync[TResult](IRetryableReadOperation`1 operation, RetryableReadContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.ReadCommandOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.FindCommandOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(IReadBinding binding, CancellationToken cancellationToken)
   at MongoDB.Driver.GridFS.GridFSForwardOnlyDownloadStream`1.GetFirstBatchAsync(CancellationToken cancellationToken)
   at MongoDB.Driver.GridFS.GridFSForwardOnlyDownloadStream`1.GetSegmentAsync(CancellationToken cancellationToken)
   at MongoDB.Driver.GridFS.GridFSForwardOnlyDownloadStream`1.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Http.StreamCopyOperationInternal.CopyToAsync(Stream source, Stream destination, Nullable`1 count, Int32 bufferSize, CancellationToken cancel)
   at Microsoft.AspNetCore.Mvc.Infrastructure.FileResultExecutorBase.WriteFileAsync(HttpContext context, Stream fileStream, RangeItemHeaderValue range, Int64 rangeLength)
   at Microsoft.AspNetCore.Mvc.Infrastructure.FileStreamResultExecutor.ExecuteAsync(ActionContext context, FileStreamResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultAsync>g__Logged|21_0(ResourceInvoker invoker, IActionResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|27_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我试图找到一种方法来为GridFS启用allowDiskUse,但找不到。

共有2个答案

怀浩大
2023-03-14

我在使用DownloadAsBytes时出现了这个错误。

通过删除数据库,然后让GridFs再次创建数据库,解决了该错误。

蒋承教
2023-03-14

您可能缺少了驱动程序应该自动创建的索引。

  • 确保您使用的是最新的驱动程序版本。
  • 将另一个文件上传到同一 GridFS 存储桶。您可以立即删除该文件。
  • 手动检查索引是否存在。请参阅此处的“索引”下,了解应该存在的内容。
 类似资料:
  • 我有2周的时间来学习和使用MongoDB,我正在使用DataGridview构建一个简单的WinForm APP。 一切正常,但我添加了超过 1.000.000 个文档,现在它向我显示此错误: MongoDB.Driver.MongoCommandException:“命令聚合失败:排序超出了 104857600 字节的内存限制,但未选择加入外部排序。正在中止操作。Pass allowDiskUs

  • 所以我在运行一个节点。js服务器和mongoose,我一直试图使用GridFS节点包下载一个大文件,但我一直收到以下错误: MongoServerError:find命令::期间执行器错误,原因是::Sort超出了104857600字节的内存限制,但未选择外部排序。 下面是我用来下载文件的代码: 鉴于在 StackOverflow 上回答您自己的问题是可以的,我想记录这个问题,以便我的解决方案可以

  • 当我连续发布数据时,我会在C#应用程序上得到发布超时错误,一旦我重新启动应用程序,它会工作几个小时。[注意:由于php需要时间完成任务,所以新的请求都在等待中,它创建队列,等待时间超过2分钟,im出现超时错误]。 我们的两台服务器都使用了最大50%的CPU和RAM使用量 我检查了两个C#代码和PHP代码都工作良好,没有任何问题或bug 提前致谢哥们儿:)

  • tabledata期间出错。包含消息的列表: 未在中列出https://cloud.google.com/bigquery/troubleshooting-errors#errortable . 每次都会发生此错误。 我们可以正常地将此表导出到GCS中。结果看起来正常(没有非常大的行)。 我们设法在实际错误发生之前检索几个结果页。 这是什么意思?我们如何解决这个错误?

  • 我试图实现一个MergeSort递归算法来对一个数组进行排序,但是我一直在合并部分遇到这个问题,我不明白为什么会出现这个错误: 线程“main”中的异常 java.lang.OutOfMemory错误:Java 堆空间 它在第 21 行标记错误 这是合并部分的代码,递归部分似乎没有问题 有人能帮帮我吗?我已经试着重新检查代码,但似乎没有任何帮助。 编辑:已经尝试扩展内存,仍然抛出这个错误

  • 请我想知道如何解决这个问题。当我试图构建签名apk时就会发生这种情况。