Mám něco jako
ptr=0; while [[ $ptr -lt 500000 ]] ; do dd if=/dev/sda bs=1M count=10 skip=$ptr conv=fullblock | md5sum -b > blok$ptr.bin ; ptr=$((ptr+10)); done
Cílem je udělat (z 5TB) jakýsi zhuštěný "hash". Například každý 1MB dat do 2bajt bloku .
Abych poznal na první pohled, která pole jsou plná nul, která plná FF, a pak(volitelně) nevím něco mezi tím (něco jako entropie), ale aby to nebylo moc výpočetně náročné. Logicky aby stejný blok měl stejný výstup.
A taky tam jsou dvě vady:
Prostřední "výkonný" blok md5sum -b má pevnou délku 160b, md5sum je pomalé,nechci md5sum, ale nějaké CRC, které mi třeba jen řekne počet nul a počet jedniček modulo 255.
Zadruhé je o procesor to v jednom sekvenčním zpracování brzdí. buď se čte a nebo vypočítává hash.
Zatřetí procesor by to ani nestíhal, kdyby jednovlákno neustále počítalo hash. Je třeba zaměstnat víc vláken
4. Opustit md5sum, sloužilo to jen jako příklad. Musí to být rychlé a zároveň nějak matematicky založené (že třeba první bajtu dává počet nul v bloku%1024) adruhý počet nul v lichých bitech. A srozumitelné, když koukn že tam je 0x80CC, tak že tam je půl napůl nuly a CC nějaká hodnota entropie. Hodně zjednodušeně
Disk má 240 MB /s, ale zpracování md5 asi 50 MB/s. Potřeboval bych to paralalizovat (i kdyby tam md5 nezůstalo).
Jak tu paralalizaci řešit? Dá se to nějak v bashi elegantně řešit nebo na to je lepší si napsat skript v rustu, perle, ruby, pythnu?
Aby disk jel maximum nonstop, nečekal na dkonočení výpočetní části, aby se nezastavoval ani neseekoval zběsile. a data předával nějakým threadům (4-8), která sama zpracují a zapíšou na příslušnou pozici.
Nechci zapisovat do 5000000 souborů *.bin, ale do jednoho 5MB/10MB souboru. Technicky i do nějaké paměťové struktury, které se občas syncne na disk.
Další nápad, vytvořím si soubor předvyplněný hodnotami třeba 0xEE. A budu vědět v případě ukončení, kde se (kdzž to bude lineární) nebo které bloky jsou "neposkvrněné čtením"
Poradíte, nakopnete, jak začít, jaké klíčové konstrukce programátorské použít?
A hlavně , jaký algoritmu výpočtu otisku bloku zvolit, ideálně nějaké funkce z knihovny jazyka, ale nic jako CRC jsem v bashi nenašel. A zda zůstatu u bashe.