Из ошибки памяти как вставка 600 МБ файлы в SQL-сервер выражают как filestream данные

(считайте раздел обновления ниже, я оставляю исходный вопрос также для ясности),

Я вставляю много файлов в дб SQL Server, настроенный для filestream.

Я вставляю в цикл файлы от папки до таблицы базы данных.

Все идет прекрасное, пока я не пытаюсь вставить файл на 600 МБ.

Поскольку это вставляет его существует +600MB использование памяти в диспетчере задач, и у меня есть ошибка.

Размер DB <1 ГБ и общий размер документов составляет 8 ГБ, я использую SQL Server Express R2, и согласно документации у меня могли быть проблемы, только если попытка вставить документ, который больше, чем 10 ГБ (Специальное ограничение) - Текущий Размер DB.

Кто-либо может сказать мне, почему у меня есть эта ошибка? Это очень крайне важно для меня.

ОБНОВЛЕНИЕ ДЛЯ ЩЕДРОСТИ:

Я предложил 150, потому что это очень крайне важно для меня!

Это, кажется, ограничение диспетчера памяти Delphi, пытаясь вставить документ, больше, чем 500 МБ, я не проверял точный порог так или иначе, это между 500 и 600 МБ). Я использую компоненты SDAC, в особенности TMSQuery (но я думаю, что то же может быть, покончили и потомок TDataset), для вставки документа в таблицу, которая имеет PK (ID_DOC_FILE) и varbinary (макс.) поле (ДОКУМЕНТ), я делаю:

procedure UploadBigFile;
var 
  sFilePath: String; 
begin 
  sFilePath := 'D:\Test\VeryBigFile.dat'; 
  sqlInsertDoc.ParamByName('ID_DOC_FILE').AsInteger := 1; 
  sqlInsertDoc.ParamByName('DOCUMENT').LoadFromFile(sFilePath, ftblob); 
  sqlInsertDoc.Execute; 
  sqlInsertDoc.Close; 
end;

Команда SDAC сказала мне, что это - ограничение диспетчера памяти Delphi. Теперь, так как SDAC не поддерживает filestream, я не могу сделать то, что было предложено в c# в первом ответе. Единственное решение сообщает Причалу, и спросите исправление ошибки?

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:

Спасибо, действительно, ко всему Вы, которые ответили мне. Наверняка вставка больших блобов может быть проблемой для Express Edition (потому что ограничения 1 ГБ поршня), так или иначе у меня была ошибка на Версии для предприятий, и это была ошибка "Дельфи", не SQL-сервер один. Таким образом, я думаю, что ответ, который я принял действительно, поражает проблему, даже если у меня нет времени проверять его теперь.

5
задан LaBracca 2 August 2010 в 08:35
поделиться

2 ответа

Вот пример, который читает файл на диске и сохраняет его в столбец FILESTREAM. (Предполагается, что у вас уже есть контекст транзакции и FilePath в переменных «filepath» и «txContext».

'Open the FILESTREAM data file for writing
Dim fs As New SqlFileStream(filePath, txContext, FileAccess.Write)

'Open the source file for reading
Dim localFile As New FileStream("C:\temp\microsoftmouse.jpg",
                                FileMode.Open,
                                FileAccess.Read)

'Start transferring data from the source file to FILESTREAM data file
Dim bw As New BinaryWriter(fs)
Const bufferSize As Integer = 4096
Dim buffer As Byte() = New Byte(bufferSize) {}
Dim bytes As Integer = localFile.Read(buffer, 0, bufferSize)

While bytes > 0
    bw.Write(buffer, 0, bytes)
    bw.Flush()
    bytes = localFile.Read(buffer, 0, bufferSize)
End While

'Close the files
bw.Close()
localFile.Close()
fs.Close()
3
ответ дан 18 December 2019 в 10:41
поделиться

Вы можете просмотреть поток байтов объекта, который вы пытаетесь вставить, и по существу буферизировать его часть за раз в вашей базе данных, пока не будет сохранен весь объект.

Я бы посмотрел на метод Buffer.BlockCopy(), если вы используете .NET

Навскидку, метод для разбора вашего файла может выглядеть примерно так:

        var file = new FileStream(@"c:\file.exe");
        byte[] fileStream;
        byte[] buffer = new byte[100];
        file.Write(fileStream, 0, fileStream.Length);
        for (int i = 0; i < fileStream.Length; i += 100)
        {
            Buffer.BlockCopy(fileStream, i, buffer, 0, 100);
            // Do database processing
        }
3
ответ дан 18 December 2019 в 10:41
поделиться
Другие вопросы по тегам:

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