Вверх ↑
Этот топик читают: Гость
Ответов: 233
Рейтинг: 12
#1: 2021-09-18 15:04:16 ЛС | профиль | цитата
При записи 1Gb данных в файл скорость записи варьируется от 1 до 2 Mb/s


Add(MainForm,2953706,105,133)
{
Width=184
Height=127
Position=1
}
Add(For,7294379,266,224)
{
Start=1
End=1048576
link(onEvent,14576586:doData,[(317,230)(317,174)])
link(onStop,16107112:doClose,[(406,237)(406,216)])
}
Add(Button,8201103,105,203)
{
Left=45
Top=30
Width=95
Caption="Создать файл"
link(onClick,12847533:doStart,[])
}
Add(FileStream,16107112,434,203)
{
FileName="File"
Mode=1
Point(doCopyFromStream)
Point(doPosition)
link(onLoad,16371609:doData,[])
link(FileName,5696980:Text,[])
}
Add(DoData,16371609,483,203)
{
link(onEventData,16107112:doPosition,[(527,209)(527,257)(422,257)(422,230)])
link(Data,16107112:Size,[(489,191)(474,191)(474,245)(447,245)])
}
Add(Hub,14685269,217,203)
{
OutCount=3
link(onEvent1,3551750:doConvert,[(255,209)(255,125)])
link(onEvent2,16107112:doOpen,[(394,216)(394,209)])
link(onEvent3,7294379:doFor,[(253,223)(253,230)])
}
Add(VisualStrings,5696980,434,161)
{
Lines=#12:F:\Проба.dat|
Width=88
}
Add(Thread,12847533,161,203)
{
Delay=0
FastStop=0
link(onExec,14685269:doEvent1,[])
}
Add(MemoryStream,13437014,336,119)
{
}
Add(StrList,15224678,280,70)
{
Strings=#1024:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456|
}
Add(StreamConvertor,3551750,280,119)
{
Mode=7
Point(Data)
link(onResult,13437014:doCopy,[])
link(Data,15224678:Text,[])
}
Add(DoData,14576586,336,168)
{
link(onEventData,16107112:doCopyFromStream,[(382,174)(382,223)])
link(Data,13437014:Stream,[])
}

Подскажите пожалуйста как увеличить скорость записи? Что я делаю не так..
карма: 2

0
Ответов: 8921
Рейтинг: 823
#2: 2021-09-18 17:03:03 ЛС | профиль | цитата
Iliya, 1 Gb ещё постараться найти где-либо
А так?


Add(MainForm,15525670,336,189)
{
Width=184
Height=127
Position=1
}
Add(Button,8201103,336,252)
{
Left=45
Top=30
Width=95
Caption="Создать файл"
link(onClick,3551750:doConvert,[])
}
Add(FileStream,16107112,455,238)
{
FileName="File"
Mode=2
AutoCopy=0
Point(doCopyFromStream)
Point(doPosition)
link(FileName,5696980:Text,[])
}
Add(VisualStrings,5696980,455,196)
{
Lines=#12:C:\Проба.dat|
Width=88
}
Add(StrList,15224678,392,182)
{
Strings=#1024:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456ABCDEFGHIJKLMNOPQRSTUVWXYZ123456|
}
Add(StreamConvertor,3551750,392,252)
{
Mode=7
link(onResult,16107112:doCopyFromStream,[])
link(Data,15224678:Text,[])
}

карма: 19

0
Ответов: 233
Рейтинг: 12
#3: 2021-09-19 01:25:41 ЛС | профиль | цитата
Леонид писал(а):
1 Gb ещё постараться найти где-либо


1GB берется из 1048576 интераций по 1Kb. Если копироватьфайл 1Gb то скорость нормальная, а если в FileStream загонять много мелких файлов, то скорость значительно падает
карма: 2

0
Ответов: 8921
Рейтинг: 823
#4: 2021-09-19 09:45:16 ЛС | профиль | цитата
Iliya писал(а):
из 1048576 интераций
Замедление ожидаемо и неизбежно, придётся потерпеть, 1 Gb не каждый день выпадает
карма: 19

0
Ответов: 233
Рейтинг: 12
#5: 2021-09-20 00:33:33 ЛС | профиль | цитата
А как-нибудь можно сделать запись файла с прогрессом хода в байтах?
карма: 2

0
Ответов: 1343
Рейтинг: 31
#6: 2021-09-20 13:27:47 ЛС | профиль | цитата
Iliya писал(а):
а если в FileStream загонять много мелких файлов


а зачем, если можно в нескольких потоках работать с мелкими файлами, тоесть скажем разбить список на равные части и записывать через два FileStream при помощи двух потоков
карма: 2

0
Ответов: 4628
Рейтинг: 749
#7: 2021-09-20 17:39:21 ЛС | профиль | цитата
Iliya писал(а):
А как-нибудь можно сделать запись файла с прогрессом хода в байтах?
Перед подачей на Str->Stream вычисляешь длину подаваемой строки с помощью компонента Length, число плюсуешь с предыдущим результатом с помощью Math и подаешь на прогресс.

Редактировалось 1 раз(а), последний 2021-09-21 13:23:31
карма: 26

0
Ответов: 5227
Рейтинг: 587
#8: 2021-09-20 19:35:07 ЛС | профиль | цитата
Iliya писал(а):
А как-нибудь можно сделать запись файла с прогрессом хода в байтах?

https://forum.hiasm.com/topic/63405
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
1
Голосовали:Iliya
Ответов: 233
Рейтинг: 12
#9: 2021-09-20 19:50:47 ЛС | профиль | цитата
andrestudio писал(а):
https://forum.hiasm.com/topic/63405

Спасибо за компонент!!!

Я пытаюсь сделать тест скорости флешек и вроде получилось переделать компонент BenchmarkHDD

Add(MainForm,2953706,175,98)
{
Width=355
Height=246
Caption="Тест скорости накопителя"
Position=1
}
Add(Button,10465805,175,210)
{
Left=20
Top=170
Width=115
TabOrder=-1
Caption="Тестировать"
link(onClick,9133256:doEvent1,[])
}
Add(Edit,8931485,560,245)
{
Left=20
Top=95
Width=235
Text="Чтение..."
ReadOnly=0
}
Add(FormatStr,366920,504,245)
{
Mask="Скорость чтение: %1 MB/s"
link(onFString,8931485:doText,[])
}
Add(Thread,4660684,308,210)
{
Delay=0
FastStop=0
link(onExec,6057204:DoTest,[])
}
Add(InlineCode,6057204,364,210)
{
WorkPoints=#30:DoTest=Тестирование накопителя|
EventPoints=#27:WriteResult=Скорость записи|26:ReadResult=Скорость чтения|
VarPoints=#24:ProgressWrite=Ход записи|23:ProgressRead=Ход чтения|
DataPoints=#19:DiskHDD=Буква диска|38:SizeTest=Размер файла для тестирования|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,Kol,Share,Debug;|0:|4:type|31: THiAsmClass = class(TDebug) |3: |10: private|21: ProgressW:integer;|21: ProgressR:integer;|3: |9: public|21: DiskHDD:THI_Event;|22: SizeTest:THI_Event;|25: WriteResult:THI_Event;|24: ReadResult:THI_Event;|0:|49: procedure DoTest(var _Data:TData; Index:word);|55: procedure ProgressWrite(var Data:TData; Index:word);|54: procedure ProgressRead(var Data:TData; Index:word);|3: |5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.DoTest;|4:var |19: i,size:integer;|32: timeStart,endTime,tmp:int64;|18: f,disk:string;|16: blk:pointer;|22: h,rd,flg:cardinal;|16: Result:real;|5:begin|14: Result := 0;|34: disk :=(ToStringEvent(DiskHDD));|36: size :=(ToIntegerEvent(SizeTest));|25: GetMem(blk, 1024*1024);|40: f := disk + ':\Test_Flash_Drive.tfd'; |133: h := CreateFile(PChar(f), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING or FILE_ATTRIBUTE_NORMAL, 0);|37: QueryPerformanceCounter(timeStart);|23: for i := 1 to size do|9: begin|40: WriteFile(h, blk^, 1024*1024, rd, nil);|15: ProgressW :=i;|5: end;|31: QueryPerformanceCounter(tmp);|17: CloseHandle(h);|0:|29: endTime := tmp - timeStart;|34: QueryPerformanceFrequency(tmp); |15: FreeMem(blk);|31: Result := size/(endTime/tmp);|34: _hi_OnEvent(WriteResult,Result);|0:|14: Result := 0;|25: GetMem(blk, 1024*1024);|39: f := disk + ':\Test_Flash_Drive.tfd';|136: h := CreateFile(PChar(f), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING or FILE_ATTRIBUTE_READONLY, 0); |37: QueryPerformanceCounter(timeStart);|23: for i := 1 to size do|9: begin|44: ReadFile(h, blk^, 1024*1024, rd, nil); |18: ProgressR :=i;|8: end;|31: QueryPerformanceCounter(tmp);|17: CloseHandle(h);|2: |29: endTime := tmp - timeStart;|33: QueryPerformanceFrequency(tmp);|24: DeleteFile(PChar(f)); |15: FreeMem(blk);|31: Result := size/(endTime/tmp);|33: _hi_OnEvent(ReadResult,Result);|0:|4:end;|0:|36:procedure THiAsmClass.ProgressWrite;|0:|5:begin|29: dtInteger(Data, ProgressW);|4:end;|0:|35:procedure THiAsmClass.ProgressRead;|0:|5:begin|29: dtInteger(Data, ProgressR);|4:end;|0:|4:end.|
link(WriteResult,450976:doConvert,[(422,216)(422,195)])
link(ReadResult,10556422:doConvert,[(422,223)(422,251)])
link(DiskHDD,4112081:Text,[])
link(SizeTest,7168988:Text,[])
}
Add(VisualStrings,4112081,364,140)
{
Lines=#1:H|
Width=53
}
Add(Edit,2964571,560,189)
{
Left=20
Top=20
Width=235
Text="Запись..."
ReadOnly=0
}
Add(ConvertorEx,450976,448,189)
{
Mode=15
link(onResult,1619973:doString,[])
}
Add(VisualStrings,7168988,371,161)
{
Lines=#4:1024|
Width=53
}
Add(Timer,13206254,273,301)
{
Enable=1
link(onTimer,2738849:doEvent1,[])
}
Add(ProgressBar,10458950,420,301)
{
Left=20
Top=55
Width=300
Max=1024
}
Add(FormatStr,1619973,504,189)
{
Mask="Скорость записи: %1 MB/s"
link(onFString,2964571:doText,[])
}
Add(StyleXP,8000213,175,154)
{
}
Add(Edit,7978056,364,301)
{
Left=270
Top=20
Text=""
ReadOnly=0
link(onChange,10458950:doPosition,[])
link(Str,6057204:ProgressWrite,[])
}
Add(ConvertorEx,10556422,448,245)
{
Mode=15
link(onResult,366920:doString,[])
}
Add(Hub,2738849,322,301)
{
link(onEvent1,7978056:doText,[])
link(onEvent2,14224937:doText,[(350,314)(350,349)])
}
Add(Edit,14224937,371,343)
{
Left=270
Top=95
Text=""
ReadOnly=0
link(onChange,14922194:doPosition,[])
link(Str,6057204:ProgressRead,[])
}
Add(ProgressBar,14922194,427,343)
{
Left=20
Top=130
Width=300
Max=1024
}
Add(Hub,9133256,224,210)
{
link(onEvent1,4660684:doStart,[])
link(onEvent2,13206254:doTimer,[(256,223)(256,307)])
}

Остался 1 нерешенный вопрос. Как сделать остановку цикла в InlineCode по нажатию кнопки?

Редактировалось 2 раз(а), последний 2021-09-20 19:51:51
карма: 2

0
Ответов: 4628
Рейтинг: 749
#10: 2021-09-21 14:05:14 ЛС | профиль | цитата
Iliya писал(а):
Как сделать остановку цикла в InlineCode по нажатию кнопки?

 THiAsmClass = class(TDebug)   
private
ProgressW:integer;
ProgressR:integer;
FAbort: Boolean;
....
public
procedure doAbort(var _Data:TData; Index:word);

....


procedure THiAsmClass.DoTest;
...
begin
...
FAbort := False;
for i := 1 to size do
begin
ReadFile(h, blk^, 1024*1024, rd, nil);
ProgressR :=i;
if FAbort then Break;
end;
....
end;

procedure THiAsmClass.doAbort(var _Data:TData; Index:word);
begin
FAbort := True;
end;
И добавить левую точку doAbort.

Редактировалось 2 раз(а), последний 2021-09-21 14:06:20
карма: 26

1
Голосовали:Iliya
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)