nesco писал(а):
Объясни мне, что такое строка, как ты себе ее представляешьЯ ее себе представляю как область данных определенной длины в оперативной памяти.
Tad писал(а):
И в памяти это единички и ноликиЗнаю. Меня беспокоит только их длина. Память не резиновая.
Обычная цепочка поток-конвертер-crc работает отменно, но жрет память четко.
Tad писал(а):
Это результат прелестей кубикостроения.Не совсем, с хиасмом давно знаком, но не часто использую. Память другим забита.
Мапинг до этого ни разу не приходилось использовать - не было необходимости. Потому и представлял его несколько иначе.
Но несмотря на то, что давно знаком с хиасмом - знаю его все меньше и меньше

Тест на 4гиговых образах показал:
цепочка - зашкаливает память, вывалилось с ошибкой.
цепочка с мапингом... то же самое

Ппц. А totalcmd работает нормально.
Тестил этим:
Add(MainForm,2953706,63,91)
{
Width=169
Height=77
}
Add(MultiElementEx,1265720,294,140)
{
@Hint=#50:Вычисляет CRC32 для файла по стандартному полиному|
link(onCRC32,5126843:doValue,[(336,146)(336,183)(191,183)(191,153)])
link(FileName,6698304:Value,[(300,132)(209,132)])
}
BEGIN_SDK
Add(EditMultiEx,15924144,21,21)
{
WorkCount=#23:doCRC32=Вычисляет CRC32|
EventCount=#32:onCRC32=Выдает результат в поток|
VarCount=#24:CRC32=Содержит результат|
DataCount=#54:FileName=Имя файла, для которого нужно вычислить CRC32|
Width=251
Height=214
link(doCRC32,9801317:doEvent1,[(31,27)(31,55)])
link(CRC32,5481093:Var1,[(27,179)])
}
Add(CRC16_32,14272136,168,140)
{
Type=1
Metod=4
Polynom="$EDB88320"
Init="$FFFFFFFF"
link(onResult,3622167:doValue,[])
}
Add(StreamConvertor,5062690,126,140)
{
link(onResult,14272136:doCalcCRC,[])
link(Data,2681121:Stream,[])
}
Add(Hub,9801317,42,49)
{
OutCount=4
link(onEvent1,10646425:doWork2,[])
link(onEvent2,10615924:doValue,[(118,62)(118,97)])
link(onEvent3,4306968:doWork2,[])
link(onEvent4,12286570:doEvent1,[])
}
Add(Memory,3622167,210,140)
{
}
Add(SharedStream,2681121,126,49)
{
CoreName="ass"
Point(CountFileBlock)
Point(PageMem)
link(onOpen,10615924:doClear,[(171,55)(171,104)])
link(FileName,15924144:FileName,[(132,35)(27,35)])
link(PageMem,10615924:Value,[(160,40)(220,40)(220,130)(188,130)])
}
Add(DoData,4750086,210,189)
{
link(onEventData,15924144:onCRC32,[(251,195)(251,27)])
link(Data,5481093:Var2,[])
}
Add(GetDataEx,5481093,210,174)
{
link(Data,3622167:Value,[])
}
Add(Memory,10615924,182,91)
{
Default=Integer(1)
Point(Data)
link(Data,2681121:CountFileBlock,[(188,86)(153,86)])
}
Add(Hub,12286570,70,70)
{
OutCount=4
link(onEvent1,10646425:doWork3,[(95,76)])
link(onEvent2,5062690:doConvert,[(113,83)(113,146)])
link(onEvent3,4306968:doWork3,[(102,90)])
link(onEvent4,4750086:doData,[(102,97)(102,195)])
}
Add(HubEx,10646425,91,49)
{
link(onEvent,2681121:doOpen,[])
}
Add(HubEx,4306968,98,63)
{
link(onEvent,2681121:doClose,[])
}
END_SDK
Add(MultiElementEx,9095369,294,301)
{
@Hint=#50:Вычисляет CRC32 для файла по стандартному полиному|
link(onCRC32,143263:doValue,[(331,307)(331,348)(194,348)(194,314)])
link(FileName,8638730:Value,[(300,293)(209,293)])
}
BEGIN_SDK
Add(EditMultiEx,3077441,21,21)
{
WorkCount=#23:doCRC32=Вычисляет CRC32|
EventCount=#32:onCRC32=Выдает результат в поток|
VarCount=#24:CRC32=Содержит результат|
DataCount=#54:FileName=Имя файла, для которого нужно вычислить CRC32|
Width=230
Height=123
link(doCRC32,9773010:doEvent1,[(31,27)(31,55)])
link(CRC32,5379092:Value,[(27,137)(202,137)])
}
Add(CRC16_32,3975153,154,98)
{
Type=1
Metod=4
Polynom="$EDB88320"
Init="$FFFFFFFF"
link(onResult,5379092:doValue,[])
}
Add(FileStream,10662988,70,49)
{
link(onLoad,9266326:doConvert,[(107,55)(107,104)])
link(FileName,3077441:FileName,[(76,35)(27,35)])
}
Add(StreamConvertor,9266326,112,98)
{
link(onResult,3975153:doCalcCRC,[])
link(Data,10662988:Stream,[(118,90)(76,90)])
}
Add(Hub,9773010,42,49)
{
link(onEvent1,10662988:doOpen,[])
link(onEvent2,10662988:doClose,[])
}
Add(Memory,5379092,196,98)
{
link(onData,3077441:onCRC32,[(240,104)(240,27)])
}
END_SDK
Add(TimeCounter,16621982,252,140)
{
link(onStart,1265720:doCRC32,[])
link(onStop,8882687:doMessage,[(289,153)(289,209)])
}
Add(Message,8882687,294,203)
{
link(Message,5126843:Value,[(300,191)(209,191)])
}
Add(TimeCounter,5919751,252,301)
{
link(onStart,9095369:doCRC32,[])
link(onStop,5314278:doMessage,[(289,314)(289,370)])
}
Add(Message,5314278,294,364)
{
link(Message,143263:Value,[(300,352)(209,352)])
}
Add(Button,10209476,119,252)
{
Width=160
Caption="crc"
link(onClick,13500866:doExecute,[])
}
Add(Button,14533549,119,91)
{
Top=20
Width=160
Caption="map"
link(onClick,9863709:doExecute,[])
}
Add(ODialog,9863709,161,91)
{
link(onExecute,6698304:doValue,[])
}
Add(ODialog,13500866,161,252)
{
link(onExecute,8638730:doValue,[])
}
Add(Memory,6698304,203,91)
{
link(onData,16621982:doStart,[(243,97)(243,146)])
}
Add(Memory,8638730,203,252)
{
link(onData,5919751:doStart,[(243,258)(243,307)])
}
Add(Memory,143263,203,308)
{
link(onData,5919751:doStop,[])
}
Add(Memory,5126843,203,147)
{
link(onData,16621982:doStop,[])
}
Работают так (Графики):
цепочка - грузит файл в оперативку (пик дисковой активности под 100%) и начинает просчет (диск 0%). Проц под 100%, память - чуть больше файла.
Мапинг - диск без пиков и в приделах 1-2%, память чуть больше файла, проц под 100%. Т.е. все то же, но активность диска почти нулевая.
Тотал - диск под 100%, проц 8-9%, память до 20мб (0.5%!).
Значит тотал считает не весь файл, а маленькими кусками. Причем быстро и эффективно - высокая нагрузка на диск и маленькая на проц.
Так, как двигать проекцию по файлу думаю разберусь. Но вот для каждого сдвига придется свой crc вычислять, не так ли?
И че потом с ними делать? Как их обьединить в один? Надо думать и разбирать алгоритм и свойства crc по кусочкам.