【发布时间】:2012-02-08 22:01:02
【问题描述】:
我有一个始终为 10 兆的字节数组。不管里面有什么数据,都是十兆。目的与大对象堆有关 (more information)。
因此,如果将一个 1Mb 的文件放入 byte[],那么最后 9 个 meg 将被清零。问题是,当我将它上传到 SQL Server 时,上传的文件总是 10 兆。我宁愿只上传必要的部分。
在将其复制到字节数组之前,我已经有了大小,因此如果需要,我可以进行修剪。问题是,我不知道如何有效地做到不在 LOH 上创建新的 byte[]。
想法?
更新 #1
这是一些伪代码。我已经删除了大部分不必要的代码。它使用 Microsoft.Practices.EnterpriseLibrary.Data 库来访问数据库。 (遗留代码,无法更改)
Param[] parametersArray = new Param[10];
// other params
parametersArray[4] = new Param("DocumentData", DbType.Binary, documentToSave.Data);
// other params
DataAccess.ExecuteNonQuery("esMD.proc_WS_UpdateDocument", parametersArray);
public static int ExecuteNonQuery(string spName, params Param[] parameters)
{
int ret = -1;
DbCommand storedProcedure = Database.Db.GetStoredProcCommand(spName);
storedProcedure.CommandTimeout = commandTimeout;
if (parameters != null)
{
foreach (Param parameter in parameters)
{
if (parameter != null)
{
Database.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value);
}
}
}
try
{
ret = MedicareDatabase.Db.ExecuteNonQuery(storedProcedure);
}
catch (Exception)
{
throw;
}
finally
{
if (storedProcedure != null)
{
storedProcedure.Dispose();
}
}
return ret;
}
更新 #2
我修改了上面的数据库调用,还修改了我输入参数的方式。
if (parameter.Size != null && parameter.Size > 0)
{
MedicareDatabase.Db.AddParameter(storedProcedure, parameter.ParameterName, DbType.Binary, parameter.Size, ParameterDirection.Input, true, 0, 0, string.Empty, DataRowVersion.Default, parameter.Value);
}
else
{
MedicareDatabase.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value);
}
这似乎对我有用。有人看到这有什么问题吗?
-乍得
【问题讨论】:
-
向我们展示您用于“将文件上传到 SQL Server”的代码
-
使用数据库调用更新。
-
您在哪里找到了使用比实际需要的更大的数组更节省内存的信息?我在您链接的那个问题的答案中看不到任何暗示。相反,建议使用几个小数组而不是一个大数组的答案,但这显然不适用于您的情况。
-
需求来自内存不足异常。如果我一次处理太多文件,我的 LOH 会变得支离破碎,我无法向其中添加新文件并且它会出错。因此,如果我不断地重新填充现有数组,那么我就不会遇到这个问题。
-
如果您使用的是 SQL Server 2008,FileStream 可能是一个替代方案,因为它支持直接从流中查找和写入。
标签: c# sql-server bytearray