gpt4 book ai didi

c# - 在数据库中存储大文件会导致类型为 'System.OutOfMemoryException' 的异常

转载 作者:太空狗 更新时间:2023-10-30 00:20:04 25 4
gpt4 key购买 nike

我构建了一个小型 MVC4 网站,用于使用代码优先方法共享文件。这些文件作为

存储在我的数据库中
public byte[] Content { get; set; }

我已经设置了

<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="536870912" />
</requestFiltering>
</security>

<httpRuntime targetFramework="4.5" executionTimeout="6000" maxRequestLength="524288"/>

将文件大小限制为 500 Mb,这样文件实际上就进入了我的代码(一开始有点卡在这上面)。

实际问题发生在我收到文件并尝试将其保存到数据库时,我调用:

DbContext.SaveChanges()

并得到这个错误:

An exception of type 'System.OutOfMemoryException' occurred in System.Data.Entity.dll but was not handled in user code

我猜这是因为我遇到了某种限制,因为数据库中的 byte[] 中可以存储多少数据(或者允许我的进程使用多少内存)。上传时一切正常较小的文件。

数据库服务器是 SQL 2008 R2 标准服务器。

为了简单起见,我宁愿避免将文件存储在磁盘上。我有什么选择?

编辑: 使用直接执行 SQL 查询插入文件的建议让我解决了将文件导入数据库的第一个问题:

DbContext.Database.ExecuteSqlCommand(
@"UPDATE FileContents
SET Content = @data
WHERE ID = @id",
new SqlParameter("id", content.ID), new SqlParameter("data", bytearray));

但是当我试图从数据库中取出文件时,我现在遇到了完全相同的错误。现在这会导致错误:

byte[] respdata = DbContext.Database.SqlQuery<Byte[]>
("SELECT TOP 1 Content FROM FileContents WHERE ID = @id",
new SqlParameter("id", filepost.File.ID)).Single();

同样,它适用于 <100 MB 的较小文件,但在处理 200 Mb 的文件时会崩溃。

根据以下答案中的评论将堆栈跟踪添加到问题中:

System.OutOfMemoryException was unhandled by user code
HResult=-2147024882 Message=Exception of type 'System.OutOfMemoryException' was thrown. Source=mscorlib
StackTrace: at System.Object.MemberwiseClone() at System.Array.Clone() at System.Data.Common.CommandTrees.DbConstantExpression..ctor(TypeUsage resultType, Object value) at System.Data.Mapping.Update.Internal.UpdateCompiler.GenerateValueExpression(EdmProperty property, PropagatorResult value) at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding target, PropagatorResult row, PropagatorResult originalRow, TableChangeProcessor processor, Boolean insertMode, Dictionary2&
outputIdentifiers, DbExpression& returning, Boolean& rowMustBeTouched)
at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildInsertCommand(PropagatorResult
newRow, TableChangeProcessor processor)
at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode
changeNode, UpdateCompiler compiler)
at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext()
at System.Linq.Enumerable.<ConcatIterator>d__71
1.MoveNext() at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable1
commands, UpdateTranslator translator)
at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager
stateManager, IEntityAdapter adapter)
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager
entityCache)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at FilePublicator2.Controllers.FileController.Upload(String qqfile) in
d:\Projects\FilePublicator2\trunk\FilePublicator2\Controllers\FileController.cs:line
115
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
controllerContext, IDictionary
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2
parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8
1.b__7(IAsyncResult ) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass37.<>c_DisplayClass39.b_33() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass4f.b_49() InnerException:

解决方案:

这是一个解决问题的完整示例:

http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/

最佳答案

OutOfMemory 与任何框架或数据库无关。这意味着 CLR 无法在请求时分配对象。

可能,您将数据保存在多个缓冲区中,例如一个在 HttpPostedFile 中,一个在内存中 byte[] 中,一个在 EF 中,...这会成倍增加所需的内存量。

切换到从 ASP.NET 流式读取和流式写入到 ADO.NET。提供教程。搜索“SQL Server 更新写入”

关于c# - 在数据库中存储大文件会导致类型为 'System.OutOfMemoryException' 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14542006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com