Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.01;
Скачать: CL | DM;

Вниз

Помогите реализовать докачку файла по локальной сети   Найти похожие ветки 

 
Diablo_al   (2003-03-05 17:56) [0]

Я мытался посимвольно копировать это получилось но очень медленно
файл размером в 600 метров копирует гдето час.
если кто-то делал подскажите как правильно


 
Slym ©   (2003-03-06 06:53) [1]

Читай побуферно (4кб*i)... Быстрее будет...


 
diablo_al   (2003-03-06 12:42) [2]

если есть примерчик поделись Плиз


 
Anatoly Podgoretsky ©   (2003-03-06 12:47) [3]

Что то сетью, а какая она у тебя?


 
Карелин Артем ©   (2003-03-06 13:12) [4]

Я не знаю что подразумевается под "копированием по сети" в данном случае, поэтому даю самый общий код по копированию файлов блоками.

procedure TForm1.Button1Click(Sender: TObject);
var st1,st2:TFileStream;
st3:TMemoryStream;
i,BlockSize,BlockNum:Integer;
begin
BlockSize:=$FFFF;
st1:=TFileStream.Create(FilenameEdit1.FileName,fmOpenRead);
st2:=TFileStream.Create(FilenameEdit2.FileName,fmCreate);
st3:=TMemoryStream.Create;
st1.Position:=0;
BlockNum:=st1.Size div BlockSize;
ProgressBar1.Max:=BlockNum;
for i:=0 to BlockNum-1 do
begin
st3.Clear;
ProgressBar1.Position:=i;
Application.ProcessMessages;
st3.CopyFrom(st1,BlockSize);
st3.SaveToStream(st2);
end;
st3.CopyFrom(st1,st1.Size-st1.Position);
st3.SaveToStream(st2);
ProgressBar1.Position:=0;
st1.Free;
st2.Free;
st3.Free;
end;


 
Translator   (2003-03-06 14:43) [5]

Попробуй копировать не посимвольно, а целым стрингом.
Я писал прогу на паскале, аналогичную твоей (по-видимому). получается гораздо быстрее. Посимвольное копирование вообще очень тормозное, поэтому открой файл и копируй стриногом, причем не ограничивай длину, то есть CopyngData: String;
Может чем поможет...


 
AlexRush ©   (2003-03-06 20:28) [6]

В HDD минимальная возможная для доступа единица информации - 1 кластер. Даже если ты читаешь 1 байт из фала, реально время тратится на считывание кластера. При чтении следующего байта HDD ждет, пока нужный кластер подойдет под головку чтенния (т.к он уже вышел из под нее), а если за это время произошло обращение к другому кластеру, то время тратится еще и на позиционирование головки. Таким образом, чтобы избежать холостого хода, читать нужно блоками, желательно кратными размеру кластера. Учитыва то, этиданные потом по сети толкаются, читать нужно небольшими блоками.

Если надо, пришлю рабочю прогу - некий примитивный аналог ReGet"a
для локалки. Очередь закачек + докачка. Интерфейс недоделан,кое где Exceptionы не прохендлены а в остальном работает. (Копирует файл небольшими блоками).


 
Anatoly Podgoretsky ©   (2003-03-06 20:30) [7]

Обращение к следующему байту не приведет к повторному чтению кластера!
А вот то что он не хочет ничего сказать про свою сеть и как он читает это очень плохо, наверно ответ ему не нужен.


 
AlexRush ©   (2003-03-06 20:33) [8]

Anatoly Podgoretsky >> "Обращение к следующему байту не приведет к повторному чтению кластера!"
Обоснуй пожалуйста.


 
Anatoly Podgoretsky ©   (2003-03-06 20:43) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2003.05.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-769
Дмитрий К.К.
2003-04-15 06:51
2003.05.01
Именинники 15 апреля


3-443
Lony
2003-04-13 14:00
2003.05.01
Как получить все записи в определёном FieldDefs?


3-428
Z_man7777
2003-04-12 07:23
2003.05.01
Вопрос по хранимой процедуре в InterBase!


3-431
gary5555
2003-04-12 15:25
2003.05.01
Как сделать неизменной нумерацию строк???


3-378
ZooN
2003-04-14 22:03
2003.05.01
MySQL