Nahradenie hex stringu

Re:Nahradenie hex stringu
« Odpověď #15 kdy: 10. 03. 2019, 16:31:20 »
3. Dovedu si samozřejmě představit, že je OS "chytrý" a dokáže podle potřeby uvolňovat kusy paměti, ale přijde mi to celé proti filosofii a smyslu toho mechanismu. Jednak on nemůže vědět, kam si budu chtít sáhnout hned v další operaci (tudíž se to celé může dost prodražit) a vůbec asi pro rychlou práci nechci takto nedeterministické chování systému.
Smysl mmapu je právě v tom, že k datům přistupujete jako k souvislému bloku paměti, a OS se na pozadí stará o nahrávání příslušných bloků z disku do paměti a opačně o zápis na disk. Je to vlastně podobný mechanismus, jako swap, akorát se na disk zapisují jen změněná data a zapisují se do toho původního souboru.


Ink

  • *****
  • 668
    • Zobrazit profil
    • E-mail
Re:Nahradenie hex stringu
« Odpověď #16 kdy: 10. 03. 2019, 16:50:19 »
3. Dovedu si samozřejmě představit, že je OS "chytrý" a dokáže podle potřeby uvolňovat kusy paměti, ale přijde mi to celé proti filosofii a smyslu toho mechanismu. Jednak on nemůže vědět, kam si budu chtít sáhnout hned v další operaci (tudíž se to celé může dost prodražit) a vůbec asi pro rychlou práci nechci takto nedeterministické chování systému.
Smysl mmapu je právě v tom, že k datům přistupujete jako k souvislému bloku paměti, a OS se na pozadí stará o nahrávání příslušných bloků z disku do paměti a opačně o zápis na disk. Je to vlastně podobný mechanismus, jako swap, akorát se na disk zapisují jen změněná data a zapisují se do toho původního souboru.

Jo, a jak poznám, kdy mi to odswapuje a kolik to skutečně sežere paměti? Co jsi mi chtěl vlastně sdělit konkrétního?

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Nahradenie hex stringu
« Odpověď #17 kdy: 10. 03. 2019, 16:54:21 »
Jo, a jak poznám, kdy mi to odswapuje a kolik to skutečně sežere paměti? Co jsi mi chtěl vlastně sdělit konkrétního?

to nepotrebujete vedet. Ani pri tom "sekvencnim" cteni neznate velikost bufferu.

Ink

  • *****
  • 668
    • Zobrazit profil
    • E-mail
Re:Nahradenie hex stringu
« Odpověď #18 kdy: 10. 03. 2019, 17:15:13 »
Jo, a jak poznám, kdy mi to odswapuje a kolik to skutečně sežere paměti? Co jsi mi chtěl vlastně sdělit konkrétního?

to nepotrebujete vedet. Ani pri tom "sekvencnim" cteni neznate velikost bufferu.

OK, řešení Kamila P. funguje, 16 GB  soubor to prohrabalo, sežralo cca 4,5 GB RAM a nespadlo to.

Re:Nahradenie hex stringu
« Odpověď #19 kdy: 10. 03. 2019, 17:27:35 »
Jo, a jak poznám, kdy mi to odswapuje a kolik to skutečně sežere paměti?
Linux (a další systémy) funguje tak, že používá tzv. virtuální paměť. Každý proces má k dispozici svůj vlastní prostor virtuální paměti – třeba na x86 zařízeních má ta virtuální paměť standardně 4 GB, bez ohledu na to, že máte v počítači třeba jen 256 MB RAM. Operační systém se pak stará o mapování mezi touhle virtuální pamětí procesu a skutečnou RAM. A při tomhle mapování může dělat i to, že data nejsou fyzicky v paměti, ale dostanou se tam až v okamžiku, kdy chce proces k příslušné části paměti přistupovat. Dostat se tam mohou například i z disku – např. ze swapu, kam si je před tím operační systém odložil, když potřeboval fyzickou RAM pro jiné účely, a nebo ze souboru, který tvoří „podklad“ pod pamětí mapovanou mmapem.

V aplikaci nepoznáte, kdy swapuje nebo načítá soubor z disku / zapisuje na disk (samozřejmě pokud si nebudete měřit čas), operační systém to dělá transparentně na pozadí. Když aplikace chce přistoupit k paměti, která není právě mapovaná na reálnou RAM, ta aplikace se uspí, vyvolá se stránkování, data ze umístí někam do fyzické paměti, ta se namapuje na adresní prostor procesu a proces se probudí. Takže z pohledu procesu to vypadá tak, že dá požadavek na přístup k paměti a data v paměti jsou, akorát kdyby si proces měřil čas, zjistí, že někdy uběhlo hodně času, o kterém nic neví (což ale může nastat i ze spousty jiných důvodů, např. CPU využíval prioritnější proces).

Kolik to skutečně sežere paměti také z procesu nepoznáte. Vtip je právě v tom, že si to celé řídí samotný OS, který má přehled o všech aplikacích v systému. Takže například může data dlouho nechávat v cache, protože ví, že nikdo RAM nepotřebuje, nebo naopak zapíše data do swapu, protože potřebuje RAM uvolnit pro jiný proces.

Co jsi mi chtěl vlastně sdělit konkrétního?
Jak doopravdy funguje mmap, a že funguje jinak, než si myslíte. Že při použití mmapu neřídí načítání ze souboru do paměti a zápis z paměti do souboru aplikace, ale operační systém. A že i když má aplikace přes mmap zpřístupněný celý soubor ve svém virtuálním adresním prostoru (ve virtuální paměti), neznamená to, že je celý ten soubor načtený ve fyzické RAM.


Ink

  • *****
  • 668
    • Zobrazit profil
    • E-mail
Re:Nahradenie hex stringu
« Odpověď #20 kdy: 10. 03. 2019, 18:45:01 »
OK, tohle mi smysl dává, dík.