Загрузка больших файлов

OracleX
Дата: 25.04.2011 17:27:24
Максим
решающее значение имеет быстродействие дисковой подсистемы
Я и не спорю с этим.
Моя реализация работы с дисковой подсистемой заимствована
у Алексея Торгашина из ATViewer, с другими не сравнивал.
Альт, для DBF использовал File Maping, наверное, так еще быстрее.

Скажу только, что обогнать SQL*Loader это дорогого стоит, не сомневайтесь.
Никола Н
Дата: 25.04.2011 17:46:29
Я еще с весьма старых времен использую такой прием для загрузки файлов.
В данном примере в командной строке передается программе имя файла, данные загружаются в память и подсчитывается их сумма.

{$APPTYPE CONSOLE}
{$R-}
type
  P1Array=^T1Array;
  T1Array=array[1..1] of byte;//dynamic array;
var
  rfname:String;
  nsize,i,sum:Int64;
  F:File;
  P:P1Array=nil;
BEGIN
  rfname:=ParamStr(1);
  AssignFile(F,rfname);
  try
    Reset(F,1);
    nsize:=FileSize(F);
  except
    Writeln('File error. Can''t work with ',rfname);
    exit;
  end;{try...except}
/////////////////////////////////
  GetMem(P,nsize);
  if P=nil then begin
    Writeln('Insufficient memory.');
    CloseFile(F);
    exit;
  end;
 
 //Load to memory.
  try
    BlockRead(F,P^,nsize); 
    CloseFile(F);
  except
    Writeln('File error. Can''t read ',rfname);
    FreeMem(P);
    CloseFile(F);
    exit;
  end;{try...except} 
 //..loaded

  sum:=0;i:=1;
  while i<=nsize do begin
    sum:=sum+P^[i]; 
    i:=i+1;
  end;
   Writeln('sum = ',sum);
  
END.
defecator
Дата: 25.04.2011 17:50:31
Никола Н
Я еще с весьма старых времен использую такой прием для загрузки файлов


Код морально устарел. Странно, что ты им пользуешься до сих пор.
Сейчас все проще (обработку ошибок тут опустил !):

var
  FS : TFileStream ;
  Buffer : Pointer ;
  BufSize : LongInt ;
begin
....
  FS := TFileStream.Create(<имя_файла>,fmOpenRead) ;
  BufSize := FS.Size ;

  GetMem(Buffer,BufSize) ;
  FS.Position := 0 ;
  FS.Read(Buffer^,BufSize) ;
.....
end ;
lnix
Дата: 25.04.2011 17:50:58
я просто пошел по пути наименьшего сопротивления...
если бы писать загрузчик файлов в ручную, то пришлось бы описывать все, а тут слизнул его через FileStream и в буфере обрабатывай.
А так да, скорее всего именно так и придется делать.
Никола Н
Дата: 25.04.2011 18:01:28
defecator
Никола Н
Я еще с весьма старых времен использую такой прием для загрузки файлов


Код морально устарел. Странно, что ты им пользуешься до сих пор.
Сейчас все проще (обработку ошибок тут опустил !):


Согласен. Просто сейчас чуток доработал до демонстрации копипасту, вырезав лишнее из старого кода :)
Никола Н
Дата: 25.04.2011 18:04:36
lnix
если бы писать загрузчик файлов в ручную, то пришлось бы описывать все, а тут слизнул его через FileStream и в буфере обрабатывай.
А так да, скорее всего именно так и придется делать.


На самом деле в твоем случае вообще не очевидна необходимость сразу весь файл грузить в память. Реально же, возможно удобнее всего было бы использовать File Mapping, о чем уже говорили. Оно тоже очень быстро работает за счет автоматического кэширования.
Maxim Rusov
Дата: 25.04.2011 18:20:57
То что File Mapping ничем не быстрее обычного последовательного чтения - долго и бурно дискутировали. Но в данной ситуации, он еще и никаким боком не подходит, как я понимаю...