2009-12-18 2 views
1

У меня есть приложение на C#, которое должно добавить большие объемы текста в базу данных SQL Server (одна строка может содержать до 1 ГБ текста). Итак, у меня есть некоторый код, который выглядит следующим образом:Эффективное добавление больших объемов текста в базу данных

SqlParameter param = command.Parameters.Add("@text", SqlDbType.NVarChar); 
param.Value = new string(buffer); 

текст добавляется в куски, так что буфер говорят, 20 МБ. Я попытался уменьшить давление памяти за счет повторного использования буферов (в отличие от создания нового char [10000000] каждый раз, когда мне нужно добавить кусок). Я замечаю, что ADO.NET, по-видимому, выделяет новый буфер для каждого вызова моего sproc. Каждый раз, когда вызывается sproc, я вижу, что рабочий набор моего процесса растет почти на 20 МБ.

Теперь, вы можете подумать, что это из-за «новой строки (буфер)» (я), но я получаю такое же поведение, когда я

param = command.Parameters.Add("@text", SqlDbType.Text, buffer.Length); 
param.Value = buffer; 

Есть ли способ, чтобы предотвратить ADO.NET от выполнения дополнительного распределения памяти каждый раз, когда я добавляю фрагмент текста в базу данных?

Спасибо!

ответ

0

Если вы используете SqlDbType.VarBinary с массивом byte[], то ADO.NET будет использовать буфер, который вы предоставляете, без копирования.

+0

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=522312 – Chris

Смежные вопросы