Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

бесконечная запись в файл   Найти похожие ветки 

 
officeman   (2005-08-05 14:21) [0]

нужно писать в файл, главное чтобы файл "рос" в объёме стремительно быстро. реально ли 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;


 
Юрий Зотов ©   (2005-08-05 14:26) [1]

> officeman   (05.08.05 14:21)  

> пример ниже. работает очень медленно.

Гм... есть подозрение, что он вообще не работает.


 
Джо ©   (2005-08-05 14:29) [2]


> for v:=0 to v+1 do v+1 begin

Красотишша! :)


 
Slym ©   (2005-08-05 14:30) [3]

Если не ошибаюсь...

 FS:=TFileStream.Create("c:\1.rec",fsCreate);
 FS.Position:=1024*1024*1024;
 FS.Free;

Получишь 1 Гб


 
officeman   (2005-08-05 14:36) [4]

for v:=0 to v+1 do v+1 begin

=)) опечатался.


 
officeman   (2005-08-05 14:37) [5]

хотел сказать
for v:=0 to v+1 do begin

ну вы меня поняли. =))

спасибо за ответ. попробую.


 
officeman   (2005-08-05 14:41) [6]

to Slym
как правильно описать FS ?


 
Alexander Panov ©   (2005-08-05 14:42) [7]

officeman   (05.08.05 14:41) [6]
FS: TFileStream;


 
Джо ©   (2005-08-05 14:54) [8]


> [3] Slym ©   (05.08.05 14:30)

Немного не так. Записать 1 Гб так:

procedure TForm1.Button1Click(Sender: TObject);
var
 FS: TFileStream;
 N: Integer;
begin
 FS:=TFileStream.Create("e:\1.rec",fmCreate);
 try
   FS.Position:=(1024*1024*1024)-SizeOf(N);
   FS.Write(N,SizeOf(N));
 finally
   FS.Free;
 end;
end;


 
Джо ©   (2005-08-05 14:56) [9]

Впрочем, на моем далеко не слабом компьютере и винчестере это дело пишется совсем не 1-3 секунды, а несколько больше...


 
officeman   (2005-08-05 14:58) [10]

да =)я тут уже опробовал. =) минут 5 назад


program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,Classes;
var
FS: TFileStream;
begin
FS:=TFileStream.Create("c:\1.rec",fmCreate);
FS.Position:=1024*1024*1024;
FS.Write("000",1);
FS.Free;
end.


всё записло на ~10 секунд. =0 даже (ctrl+alt+del) неработало =/
Но файл создался на 1 Gb


 
Джо ©   (2005-08-05 15:21) [11]


>  [10] officeman   (05.08.05 14:58)

Ну уж нет, твой код создал файл размером 1073741825 байт, то есть 1 Гб + 1 байт :)


 
officeman   (2005-08-05 15:28) [12]

хахахаха! =) приколист


 
3DxFantastika ©   (2005-08-05 15:48) [13]

скорость записи в файл ограничена скоростью работы винчестера, но возможно ли "создать" 1ГБ файл не записывая его? это действительно интересно (как-бы создать 1 байт файл и "поставить" ему размер в 1 ГБ)


 
Styx   (2005-08-05 16:06) [14]

http://msdn.microsoft.com/library/en-us/fileio/fs/sparse_file_operations.asp


 
han_malign ©   (2005-08-05 16:48) [15]

>работает очень медленно
>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 кластер...


 
Fay ©   (2005-08-05 17:42) [16]

У меня получилось 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;


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


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


Lazy write?

--
Regards, LVT.


 
Fay ©   (2005-08-05 19:33) [18]

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


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

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


 
Fay ©   (2005-08-05 19:38) [20]

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


 
Alexander Panov ©   (2005-08-05 19:53) [21]

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


 
3DxFantastika ©   (2005-08-05 20:11) [22]

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


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

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

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

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


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

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


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


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

спс


 
Slym ©   (2005-08-08 08:56) [26]

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

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


 
Leonid Troyanovsky ©   (2005-08-08 10:18) [27]


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

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


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

--
Regards, LVT.


 
Slym ©   (2005-08-08 14:01) [28]

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


 
Leonid Troyanovsky ©   (2005-08-08 14:39) [29]


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


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

--
Regards, LVT.


 
3DxFantastika ©   (2005-08-09 11:40) [30]

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


 
Leonid Troyanovsky ©   (2005-08-09 11:50) [31]


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


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

--
Regards, LVT.


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

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 12:41) [33]


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


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

--
Regards, LVT.


 
han_malign ©   (2005-08-09 12:43) [34]

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



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

Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.215 c
4-1121334928
IceBeerg
2005-07-14 13:55
2005.08.28
Установка даты.


4-1120735919
DeepProg
2005-07-07 15:31
2005.08.28
NetWkstaUserEnum


3-1121360879
Sam Stone
2005-07-14 21:07
2005.08.28
Формат даты


3-1121319772
bsFrame
2005-07-14 09:42
2005.08.28
.edb - что это за база такая?


1-1123521771
Андрей Молчанов
2005-08-08 21:22
2005.08.28
TStringList.AddObject





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский