Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Внизбесконечная запись в файл Найти похожие ветки
← →
officeman (2005-08-05 14:21) [0]нужно писать в файл, главное чтобы файл "рос" в объёме стремительно быстро. реально ли 1гб в 1-3 секунды ?
если да, то каким методом ?
т.к. пример ниже. работает очень медленно. гдето 3-6 Mb/сек.
beginHand:=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.043 c