Zdravím, chtěl bych se zeptat, jak zjistím počet různých čísel v textovém souboru, jehož velikost je příliš velká na to, aby se všechna čísla dala uložit do pole, nebo spojového seznamu, a který obsahu je čísla v rozsahu typu integer?
Fórum › Pascal
Třídění textového souboru v Pascalu
#1 Markéta
pokud uvažuješ soubor o velikosti třeba 10000 TB tak asi těžko ... :)))
jak je ten soubor velkej ??? 1GB ? nebo tak nějak ? jde o to, že v starým pascalu je limit 64KB pro statický proměnný a necelej 1MB pro dynamický
To samozřejmě nespočítáš bez toho, že by sis ty výskyty nějak pamatoval(a). Když se to nevejde do paměti, tak třeba do souboru. Pokud prostě není možnost si to pamatovat, tak se to dá jen odhadovat, ale kdybyste řešili takové algoritmy, tak nepřijdeš s tímhle dotazem.
Tady možná půjde o to, že ti na každé číslo stačí jeden bit.
#1 Markéta
....no existuje možnost, že nebudeš používat paměť RAM pro ukládání mezivýsledků ale všechno budeš zapisovat do souboru na disku - použiješ disk místo paměti, ale počítej s tim, že magnetickej disk má seek cca 12ms. Navíc mám takovej pocit, že starej pascal měl limit pro velikost souborů 128MB a později 2GB. Nezapomeň si vynásobit (2GB^2)x12ms a to je nejhorší časový odhad JEN pro čtení. V reálu budeš někde níže .... Takže asi budeš muset použít nějakou rychlou M.2 s přístupem 3000MB zápis/2500MB čtení. Tvuj dotaz je ale stejně divnej ...
#1 Markéta
Vzhledem k tomu, že se má zjistit počet RŮZNÝCH čísel v souboru, tak není potřeba ukládat do paměti celý ten soubor, ale jenom informaci o tom, které číslo už jsi viděla a které ještě ne. Tj. asi pole booleanů s indexem o rozsahu typu integer. V prvním cyklu projdeš soubor a zapamatuješ si nalezená čísla, ve druhém projdeš to pole a spočítáš, kolik prvků má hodnotu true.
Jestli používáš nějaký realmodový pascal (Turbo apod.), tak je integer 16bitový, pole array[integer] of boolean zabere přesně 64 KB a jako statická globální proměnná by mělo normálně fungovat. Jestli děláš v 32bitovém prostředí (Freepascal apod.), integer je 32bitový a pole zabere 4 GB - to je hodně, ale s virtuální pamětí OS snad ještě proveditelné. Jestli ne, dá se objem dat zredukovat na osminu tím, že jednotlivé booleany budeš ukládat jako bity (trochu víc režie, ale pořád jednoduché a rychlé) a půl giga už je v pohodě.
Moje stránka.
#7 Mircosoft
V zadání není uveden datový typ čísla (int, float...) a tak rozsah čísla a počet jeho desetinných míst není nijak omezen. Takže použití pole typu boolean o konečném počtu prvků je nevhodné.
Nezbude, než použít postup uvedený výše: každé číslo při jeho prvním výskytu někam uložit - v nejhorším případě do souboru - a vytvářet tak seznam unikátních čísel. Každé číslo porovnávat s tímto seznamem. Zefektivnění pro velký počet unikátních čísel lze dosáhnout tím, že seznam čísel, která se již vyskytla, rozdělí na intervaly a porovnávání bude provádět jen na dílčím intervalu.
hu
#1 Markéta
Starej turbo pascal v7 měl rozsah čísel typu Integer roven <-32768,+32767>. Takže ste si asi moc velkej soubor udělat nemohli. Pak byl eště LongInt <-2147483648,+2147483647>. Ano, byl tu s námi 16bit mode zvaný jako 16bit protected mode viz http://dos32a.narechk.net/index_en.html ale ten s námi setrval jen asi 2 roky a pak umřel :) ... a týkal se procesorů 80286 :) ty už sou taky mrtvý...
32bit integer je 32bit jenom v dnešní době ale tehdy byl 16bitovej ....
Nechápu proč někdo v roce 2018 eště používá pascal. navíc FreePascal má poslední stabilní verzi 1.0 všechno další nefunguje.... Je tu C#, Java a samozřejmě vymršenej UWP ... a stejně 90 procent softwaru se v dnešní době dělá pro web ... učit se pascal je sebevražda ...
"navíc FreePascal má poslední stabilní verzi 1.0" no to je blábol. Pascal sice není in, ledacos mu chybí a má spoustu nedostatků, ale tvrdit, že je mrtvej, to je jinej level. Když o vývoji pascalu (Delphi, FPC, Oxygene) nic nevíš, nebo žiješ před pětadvaceti lety, tak se k tomu laskavě nevyjadřuj.
Co sem taháš protected mode taky nevim, to je 35+ let stará záležitost procesoru (a přeneseně tudíž kompileru), programovacího jazyka se to netýká.
#11 Sniper
kdo z vás naposled dělav ve Free Pascalu ?
verze:
i8086 MS-DOS
a
Intel/i386 Dos (GO32v2 extender)
on opravdu funguje ? spousta věcí tam nefunguje, nefunguje grafika, fonty atd ...atd .. poslední stabilní verze je 1.0
verze pro linux je na tom o poznání lépe :)
a DOS32X extender pořád běží na hromadě starejch NC-ček a telefonních ústředen.
Já dneska ráno. Mluvím o tomhle Free Pascalu: https://www.freepascal.org
Poslední stable release je 3.0.4 (pravda dnes již předloňský), trunk taky většinou jede dobře. Na FPC je postavený Lazarus, takže i GUI aplikace a použitelný editor/vývojové prostředí také nejsou problém.
Nemáš na mysli spíš Turbo Pascal nebo podobně?
Nezpochybňuju že starej HW je pořád kolem nás a je ho třeba, ale řešit to u školní úlohy mi přijde totálně mimo mísu.
Njn, osm let zpět. Fonty - předpokládám že se bavíme o GUI aplikaci, to by znamenalo že je problém v použitý komponentě/knihovně (Lazarus nebo něco jinýho?), ne v FP samotným, protože ten, podobně jako třeba holý C, pro nic takovýho podporu nemá.
Je fakt že pár let zpět to bylo s LCL (Lazarus component library) dost tragický, ale teď je to podstatně lepší. Ale zase, to není otázka jazyka, ale knihoven.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Třídění dat v souboru — založil griddlecake
Matice z textového souboru ? — založil Robin93
Procházení textového souboru — založil dragon124
Cteni z textoveho souboru — založil tomas
Načtení textového souboru — založil Mr.M
Moderátoři diskuze