Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

бесконечная запись в файл [D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

officeman ©   (2005-08-05 14:21:00) 

нужно писать в файл, главное чтобы файл 'рос' в объёме стремительно быстро. реально ли 1гб в 1-3 секунды ?
если да, то каким методом ?

т.к. пример ниже. работает очень медленно. гдето 3-6 Mb/сек.

begin
Hand:=FileCreate('c:\1.rec');
for v:=0 to v+1 do v+1 begin
FileWrite(Hand,'000000000000000000000000000',30);
end;


han_malign   (2005-08-09 12:43:00) [1]

> на FAT пройдет, а на NTFS дыры реально не пишутся
- sparse files - по умолчанию выключено, так что на NTFS тоже запишется, если компрессия на дисках не включена...
http://www.microsoft.com/resources/documentation/Windows/XP/all/reskit/en-us/Default.asp?url=/resources/documentation/Windows/XP/all/reskit/en-us/prkc_fil_aixf.asp


Leonid Troyanovsky   (2005-08-09 12:41:00) [2]


> Игорь Шевченко ©   (09.08.05 11:55) [32]
> И впрямь 0 секунд...


Ну, у меня ~15 мс.
Интересно посмотреть Performance Monitor Avg.Disk Bytes/Write
для объекта Physical Disk.
Т.е., сам процесс записи длится более минуты.
Видимо, это идет обнуление страниц для созданного файла.
А чего, собс-но, еще требуется, если в файл мы ничего
не пишем, разве что резервирование всяческих описателей.

--
Regards, LVT.


Игорь Шевченко   (2005-08-09 11:55:00) [3]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TfMain = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Label1: TLabel;
   lbTime: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   procedure CreateLargeFile (const Filename: string);
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.Button1Click(Sender: TObject);
begin
 CreateLargeFile (Edit1.Text);
end;

procedure TfMain.CreateLargeFile(const Filename: string);
var
 FH: HFILE;
 Start: TDateTime;
begin
 FH := CreateFile (PChar(Filename), GENERIC_WRITE, 0, nil, CREATE_NEW,
   FILE_ATTRIBUTE_NORMAL, 0);
 Win32Check(FH <> INVALID_HANDLE_VALUE);
 Start := Now;
 try
   SetFilePointer (FH, 1024*1024*1024, nil, FILE_BEGIN);
   SetEndOfFile(FH);
 finally
   CloseHandle(FH);
 end;
 lbTime.Caption := FormatDateTime ('hh:nn:ss', Now - Start);
end;

end.


И впрямь 0 секунд...


Leonid Troyanovsky   (2005-08-09 11:50:00) [4]


> Leonid Troyanovsky ©   (08.08.05 14:39) [29]
> а что такое Lazy write?


Алгоритм отложенной записи.
Т.е., буферы сбрасываются на диск не сразу, а, скажем так, по принуждению.
Подробности в той самой книге.

--
Regards, LVT.


3DxFantastika   (2005-08-09 11:40:00) [5]

Leonid Troyanovsky ©   (08.08.05 14:39) [29]
а что такое Lazy write?


Leonid Troyanovsky   (2005-08-08 14:39:00) [6]


> Slym ©   (08.08.05 14:01) [28]
> Пока ты не закроешь/зафлюшиш заMapленый и заViewеный файл
> размер его (в эксплорере не изменится)


Map здесь сбоку. Подробности у Рихтера.
Lazy write - у Соломона-Руссиновича.

--
Regards, LVT.


Slym   (2005-08-08 14:01:00) [7]

Leonid Troyanovsky ©   (08.08.05 10:18) [27]
Пока ты не закроешь/зафлюшиш заMapленый и заViewеный файл размер его (в эксплорере не изменится)


Leonid Troyanovsky   (2005-08-08 10:18:00) [8]


> Slym ©   (08.08.05 08:56) [26]
> возможно ли "создать" 1ГБ файл не записывая его? это действительно

> Возможно... На то FileMapping и создан... Файл 100 мб, а
> на диске 0б (реально все 100мб но система этого не показывает)


Сомневаюсь, что FileMapping создан именно для этого,
тем более, что система его покажет.
Если, конечно, он не на базе файла подкачки.

--
Regards, LVT.


Slym   (2005-08-08 08:56:00) [9]

3DxFantastika ©   (05.08.05 15:48) [13]
возможно ли "создать" 1ГБ файл не записывая его? это действительно интересно (как-бы создать 1 байт файл и "поставить" ему размер в 1 ГБ)

Возможно... На то FileMapping и создан... Файл 100 мб, а на диске 0б (реально все 100мб но система этого не показывает)


officeman   (2005-08-07 13:16:00) [10]

спс


Alexander Panov   (2005-08-05 21:11:00) [11]

officeman   (05.08.05 20:49) [23]
Подскажи как реализовать чтобы и при НТФС поддерживалась запись


Так дисковое пространство будет распределено и на FAT и на NTFS.


officeman   (2005-08-05 20:49:00) [12]

ухты...как тема развилась за 4 часа.! =) Спасибо всем участникам!

to han_malign
>на FAT пройдет, а на NTFS дыры реально не пишутся
Подскажи как реализовать чтобы и при НТФС поддерживалась запись.

to Fay
>У меня получилось 0 мс
Обязательно проверю =) до 6 секунд на P4, меня устроит.


3DxFantastika   (2005-08-05 20:11:00) [13]

Fay ©   (05.08.05 19:38) [20]
у меня максимальная скорость записи в файл 40 МБ/сек ..


Alexander Panov   (2005-08-05 19:53:00) [14]

Думаю, что скорость зависит
1. От типа файловой системы.
2. От фрагментированности диска.


Fay   (2005-08-05 19:38:00) [15]

2 3DxFantastika ©   (05.08.05 19:35) [19]
Не знаю, как достигаются такие показатели. Твоему компу сколько лет?


3DxFantastika   (2005-08-05 19:35:00) [16]

Fay ©   (05.08.05 17:42) [16]
у меня с немного другим размером на FA32 получалось  8000мс а на NTFS 100-1200мс 0 мс было только при ошибках .. (нехватка места например)


Fay   (2005-08-05 19:33:00) [17]

2 Leonid Troyanovsky ©   (05.08.05 19:17) [17]
>>  главное чтобы файл 'рос' в объёме стремительно быстро
8)


Leonid Troyanovsky   (2005-08-05 19:17:00) [18]


> Fay ©   (05.08.05 17:42) [16]
> У меня получилось 0 мс


Lazy write?

--
Regards, LVT.


Fay   (2005-08-05 17:42:00) [19]

У меня получилось 0 мс
var
 h, tc : DWORD;
begin
 tc := GetTickCount;
 h := CreateFile('c:\qwe.asd', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 if h = INVALID_HANDLE_VALUE then
   RaiseLastOsError;
 SetFilePointer(h, $40000000, nil, FILE_BEGIN);
 SetEndOfFile(h);
 CloseHandle(h);
 ShowMessage(Format('%d ms', [GetTickCount - tc]));
end;


han_malign   (2005-08-05 16:48:00) [20]

> работает очень медленно
> FileWrite(Hand,'000000000000000000000000000',30);
- при маленьком буфере время записи сравнимо с накладными расходами системного кеширования - пишется в разы медленнее. Размер эффективного буфера должен быть кратен размеру кластера (обычно 4Кб - размер страницы виртуальной памяти), хотя рекомендую именно 65Кб - размер аппартного буфера SCSI. Microsoft примочки чаще всего используют буфер в 0x80000 (512 Кб), хотя я профилировал - больше 65Кб - разница скорости в пределах погрешности.

> реально ли 1гб в 1-3 секунды ?
- пиковая пропускная 333Мб/с - на UltraWideSCSI2...
А ATA-33/66/100/133 - говорит само за себя.

> FS:=TFileStream.Create('c:\1.rec',fmCreate);
> FS.Position:=1024*1024*1024;
- на FAT пройдет, а на NTFS дыры реально не пишутся(chained по моему называется) - размер 1Гб, а занимает 1 кластер...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо