SQL: Последовательно делающее ОБНОВЛЕНИЕ.WRITE на столбце VarBinary

Я пытаюсь создать немного тестового приложения, которое читает блоки FileStream и добавляет его к VarBinary (макс.) столбец на Экспрессе SQL Server 2005 года.

Все работает - столбец заполняется, как он, как предполагается, но моя машина все еще, кажется, буферизует все в память, и я просто не вижу почему.

Я использую следующий код (C#):

using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
    connection.Open();

    string id = Guid.NewGuid().ToString();

    using (IDbCommand command = connection.CreateCommand())
    {
        command.CommandText = "INSERT INTO [BLOB] ([Id],[Data]) VALUES (@p1,0x0)";

        SqlParameter param = new SqlParameter("@p1", SqlDbType.VarChar);
        param.Value = id;
        command.Parameters.Add(param);

        command.ExecuteNonQuery();
    }

    if (File.Exists(textBox1.Text))
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            command.CommandText = "UPDATE [BLOB] SET [Data].WRITE(@data, @offset, @len) WHERE [Id]=@id";

            SqlParameter dataParam = new SqlParameter("@data", SqlDbType.VarBinary);
            command.Parameters.Add(dataParam);

            SqlParameter offsetParam = new SqlParameter("@offset", SqlDbType.BigInt);
            command.Parameters.Add(offsetParam);

            SqlParameter lengthParam = new SqlParameter("@len", SqlDbType.BigInt);
            command.Parameters.Add(lengthParam);

            SqlParameter idParam = new SqlParameter("@id", SqlDbType.VarChar);
            command.Parameters.Add(idParam);
            idParam.Value = id;

            using (FileStream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                byte[] buffer = new byte[2090400]; //chunk sizes that are multiples of 8040 bytes.
                int read = 0;
                int offset = 0;

                while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    dataParam.Value = buffer;
                    offsetParam.Value = offset;
                    lengthParam.Value = read;

                    command.ExecuteNonQuery();

                    offset += read;
                }
            }
        }
    }
}

Кто-либо может сказать мне, почему это буферизует файл в память? byte[] буфер, который я использую, составляет только почти 2 МБ в размере.

Я мог создать новый буфер для каждого блока, но это походит на трату ЦП/памяти также...

7
задан Juan Mellado 3 May 2012 в 10:26
поделиться

2 ответа

он буферизует его, потому что, когда вы сохраняете его в столбце varbinary, он становится частью кеша данных LOB на сервере sql. вот как это работает.

или вы имеете в виду, что он буферизуется где-то еще?

2
ответ дан 7 December 2019 в 12:21
поделиться

Класс FileStream буферизует ввод и вывод. Вы можете вызывать метод Flush () после каждого обновления для очистки внутренних буферов.

Для ясности, он будет буферизоваться только до размера буфера (4 КБ).

В этом случае, я думаю, ваш виноват SqlExpress. Когда я выполнил ваш код и записал в свою локальную копию SqlExpress, использование памяти процессом sqlsrvr подскочило примерно на 1 ГБ. Когда я писал в нелокальную базу данных, объем моей памяти оставался неизменным.

он будет буферизоваться только до размера буфера (4 КБ).

В этом случае я думаю, что ваш виновник - SqlExpress. Когда я выполнил ваш код и записал в свою локальную копию SqlExpress, использование памяти процессом sqlsrvr подскочило примерно на 1 ГБ. Когда я писал в нелокальную базу данных, объем моей памяти оставался неизменным.

он будет буферизоваться только до размера буфера (4 КБ).

В этом случае я думаю, что ваш виновник - SqlExpress. Когда я выполнил ваш код и записал в свою локальную копию SqlExpress, использование памяти процессом sqlsrvr подскочило примерно на 1 ГБ. Когда я писал в нелокальную базу данных, объем моей памяти оставался неизменным.

3
ответ дан 7 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: