Author Topic: Загрузка и выгрузка файлов большого размера  (Read 4973 times)

0 Members and 1 Guest are viewing this topic.

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
Вообщем загружаю файл в blob-поле.
  DataModule2.ComTable.Edit;
  DataModule2.ComTablefiles.LoadFromFile(AddDlg.FileName);
Если файл небольшого размера (0,5М), то в принципе все нормально. Но если он больше 10М, то загружается доволно долго.

Дальше, когда я его выгружаю, естественно происходит то же самое, все очень долго
  TBlobField(Files).SaveToFile(stPath + '\спец');
   PdfForm.AcroPdf1.LoadFile(stPath + '\спец');
   PdfForm.AcroPDF1.gotoFirstPage;
   PdfForm.ShowModal;

Может кто подскажет, как можно все это сделать быстрее? Я новичек в написании баз данных. В гугле и здесь ничего не нашел по этому поводу

Я подумал, если файлов будет много, тогда вообще невозможно будет работать.
« Last Edit: July 16, 2008, 16:29:03 by blackmask »

Offline visual

  • Hero Member
  • *****
  • Posts: 714
  • Karma: +0/-0
    • http://
Quote from: blackmask
Может кто подскажет, как можно все это сделать быстрее? Я новичек в написании баз данных. В гугле и здесь ничего не нашел по этому поводу
Я подумал, если файлов будет много, тогда вообще невозможно будет работать.
для начала три простых вопроса:
1. какой драйвер используется (connection string покажи)?
2. какой размер пакета используется?
3. секционирование сделал?

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
1.
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DataName;Data Source=CompName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CompName2;Use Encryption for Data=False;Tag with column collation when possible=False
Поставщик данных: Microsoft OLE DB Provider for SQL Server
 
2. Packet Size=4096. А сколько будет оптимально?

3. секционирование не делал. если честно, то пока незнаю даже как это делается, но думаю скоро узнаю

Вообще, планируется хранить небольшие файлы, но мало ли

Offline visual

  • Hero Member
  • *****
  • Posts: 714
  • Karma: +0/-0
    • http://
Quote from: blackmask
1.
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DataName;Data Source=CompName;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CompName2;Use Encryption for Data=False;Tag with column collation when possible=False
Поставщик данных: Microsoft OLE DB Provider for SQL Server
2. Packet Size=4096. А сколько будет оптимально?
- выставить "Use Procedure for Prepare=0;"
- размер буфера увеличить до 16384, прирост скорости будет, но не сильно большой.
- сделай профилирование, разбей эту задачу на отдельные операции. значала закачай файл в TFileStream, посмотри с какой скоростью отдается файл с файловой системы. потом сохрани поток в базу, посмотри сколько времени ушло на эту операцию. найди где тормоза.
- не работай с таблицами напрямую, забудь про TAdoTable, используй TAdoQuery, а лучше TAdoStoredProc.
- посмотри с какой скоростью работает TAdoBlobStream, вот примерный кусок кода для выгрузки из базы. обратную операцию сам сделаешь.
Code: [Select]
       with DM.qGetFile do
       begin
         Parameters.ParamByName('ID').Value := ID;
         Open;
         SaveDialog:=TSaveDialog.Create(self);
         SaveDialog.Filter:='Adobe PDF (*.pdf)|*.PDF';

         AdoBlobStream := TAdoBlobStream.Create(TBlobField(FieldByName('File')), bmRead);
         if AdoBlobStream.Size > 0 then
           if SaveDialog.Execute then
             AdoBlobStream.SaveToFile(ChangeFileExt(SaveDialog.FileName, '.pdf'));

         AdoBlobStream.Free;
         SaveDialog.Free;
         Close;
       end;

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
Большое спасибо.

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
Выставил 'Use Procedure for Prepare = 0'
Увеличил размер буфера до 16384
Большие тормоза при сохранении потока в базу. СУБД находится на другом компе в локальной сети и сохраняется очень долго. Более того когда сохранил файл 110М начало все приложение тормозить, по дереву TreeView практически невозможно стало ходить. Процесс проги стал занимать 316М. Просто после старта программы. Вот процедура FormShow

procedure TMainForm.FormShow(Sender: TObject);
var
node: TTreeNode;
begin
TreeView1.Items.BeginUpdate;
DataModule2.NameTable.Sort := 'names ASC';
DataModule2.NameTable.First;
TreeView1.Items.Clear;

 while not DataModule2.NameTable.Eof do begin
   node := TreeView1.Items.Add(nil,
   DataModule2.NameTable.FieldByName('names').AsString);
   node.HasChildren := true;
   DataModule2.NameTable.Next;
 end;

 TreeView1.SetFocus;
 TreeView1.Items.EndUpdate;
end;

В таблице NameTable только два поля names - varchar(30) и namesID - int. А прога загружается сек. 30.
К файлу я обращаюсь только после нажатия кнопки Описание

DataModule2.FilesQuery.Active := false;
  DataModule2.FilesQuery.SQL.Clear;
  DataModule2.FilesQuery.SQL.Add('select files from component');
  DataModule2.FilesQuery.SQL.Add('where marking = :mark');
  DataModule2.FilesQuery.Parameters.ParamByName('mark').Value := marking2;
  DataModule2.FilesQuery.Active := true;

 AdoBlobStream := TAdoBlobStream.Create(TBlobField(DataModule2.FilesQuery.FieldByName('files')), bmRead);
  if AdoBlobStream.Size > 0 then begin
    AdoBlobStream.SaveToFile(stPath + '\спец');
    PdfForm.AcroPdf1.LoadFile(stPath + '\спец');
 end;
PdfForm.ShowModal;
AdoBlobStream.Free;


Использование AdoBlobStream прироста особенного не дало

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
А секционирование поддерживается только редакцией Enterprise Edition. У меня Standard

Partition function can only be created in Enterprise edition of SQL Server. Only Enterprise edition of SQL Server supports partitioning.
« Last Edit: July 17, 2008, 17:00:38 by blackmask »