Я пытаюсь запросить базу данных и извлечь файлы Excel, размер которых может достигать 1 миллиона строк (~200 МБ), хранящихся как varbinary
, и передать их через средство проверки.
Наш сервер сборки имеет 6 ГБ памяти и процессор с балансировкой нагрузки, и во время выполнения даже близко не достигает максимальной загрузки ЦП или памяти.
Тем не менее, примерно через 40 секунд процесс выдает ошибку OutOfMemoryException
.
Вот трассировка стека:
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Data.SqlTypes.SqlBinary.get_Value()
at System.Data.SqlClient.SqlBuffer.get_ByteArray()
at System.Data.SqlClient.SqlBuffer.get_Value()
at System.Data.SqlClient.SqlDataReader.GetValueFromSqlBufferInternal(SqlBuffer data, _SqlMetaData metaData)
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at System.Data.SqlClient.SqlCommand.CompleteExecuteScalar(SqlDataReader ds, Boolean returnSqlValue)
at System.Data.SqlClient.SqlCommand.ExecuteScalar()
at eConfirmations.DataService.FileServices.FileDataService.GetFileContent(Guid fileId) in d:\w1\3\s\Source\eConfirmations.DataService\FileServices\FileDataService.cs:line 157
...
at System.Data.SqlTypes.SqlBinary.get_Value()
at System.Data.SqlClient.SqlBuffer.get_ByteArray()
at System.Data.SqlClient.SqlBuffer.get_Value()
at System.Data.SqlClient.SqlDataReader.GetValueFromSqlBufferInternal(SqlBuffer data, _SqlMetaData metaData)
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at System.Data.SqlClient.SqlCommand.CompleteExecuteScalar(SqlDataReader ds, Boolean returnSqlValue)
at System.Data.SqlClient.SqlCommand.ExecuteScalar()
at eConfirmations.DataService.FileServices.FileDataService.GetFileContent(Guid fileId) in d:\w1\3\s\Source\eConfirmations.DataService\FileServices\FileDataService.cs:line 157
А вот мой код, который генерирует исключение:
private byte[] GetFileContent(Guid fileId)
{
byte[] content;
string connectionString = ConfigurationManager.ConnectionStrings["eConfirmationsDatabase"].ConnectionString;
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
sqlCommand.CommandTimeout = 300;
sqlCommand.CommandText = $"SELECT Content FROM dbo.[File] WHERE FileId = '{fileId}'";
sqlConnection.Open();
content = sqlCommand.ExecuteScalar() as byte[];
sqlConnection.Close();
sqlCommand.Dispose();
}
sqlConnection.Dispose();
}
return content;
}
Есть ли более эффективный способ получить эти данные или мы можем обновить настройку на нашем сервере сборки, чтобы избежать этой ошибки?
GetBytes
не должен быть равен 0, а не 1? - person Magnus   schedule 19.04.2017