Olen aina silloin tällöin katsellut Survo-keskustelua. Vähänpä täällä tapahtuu.
Olen ilahtunut siitä, että ainakin Kimmo on pari kertaa kirjoittanut tekemisistään. Etenkin kevään survokentistä oli itsellenikin hyötyä. Olisi mukavaa, jos tällekin sivustolle saisi vähän elämää. Itselleni Survo on osa elämäntapaani ja käytän sitä päivittäin ja teen aina silloin tällöin sukroja omaan käyttööni. Se on eläkelläiselle sopivaa aivojen virkistystä. Kerronpa tässä eräästä viimeaikaisesta työstäni jotta joku muukin innostuisi kertomaan mitä on tehnyt. Minulla on kohtalainen määrä eri vuosina käytössä olleita ulkoisia kiintolevyjä. Halusin tehdä järjestelmän, jonka avulla voisin saada rekisterin jokaisen kiintolevyn sisällöstä ja tavumääristä hakemistoittain. Survo MM ohjelmasta löysin Kimmon 1997 tekemän TREE - ohjelman. Sillä saa näppärästi ja todella nopeasti haettua hakemistopolut, kun määrää sen hakemaan myös alihakemistot (esim LEVEL=9). Kuitenkaan tavuja se ei pysty oikein laskemaan jos hakemiston levytila on tarpeeksi iso. Ainakin 3.5 gigan levytilan se pystyi laskemaan, mutta ei paljon sitä isompia. 1997 tuollainen levytila oli älyttömän suuri ja on ymmärrettävää, ettei suurempiin levytilaan tullut mieleenkään varautua. Niinpä rakensin oman järjestelmän. Käytän ensiksi tree-ohjelmaa. Luon sen avulla survotiedoston, josta otan vain pelkän hakemiston muuttujana, en muuttujien lukumäärää tai tavujen lukumäärää. Käytin sitten Kimmon INDEX-komentoa määreillä CD=0 COMMENTS=0 DATE=0 TIME=0 ja täten sain riville vain esim. NÄYTTÖKOMENTO TIED.NIMI / BITIT FILE SHOW TIED.SVO / 1345677 /OPEN AANI TIEDOSTO 1 / 1200111233 /OPEN KUVA.NEF / 45123340 /OPEN KUVA.JPG / 1512334 Varmin systeemi on, että poimii jokaisen rivin lopusta viimeisen sanan, joka on aina tavumäärä. Tämä on kuitenkin hidas systeemi, ja 3.6 teran levyllä se saattaa merkitä yli 2 tunnin hakuaikaa. Jotta saisin laskettua nopeammin tavumäärät hakemistosta, jossa saattaa olla satoja tiedostoja, käytin ensiksi FORM -komentoa suoristaakseni rivit ja sen jälkeen L+ komentoa laskeakseni tavumäärät. Aloitin ohjelmanteon ensiksi R:llä, mutta huomasin, että INDEX komento ei toimi oikein, jos tavumäärät ovat todella suuria, silloin tavumäärä jää kokonaan pois ja tulee () tavujen tilalle. Lisäksi Survo-R:llä tiedostojen nimet tulevat pitkinä niminä. Survo MM ohjelmassa isojen tiedostojen kohdalla tulee tavumäärän eteen "-" merkki, mutta muuten tiedoston koko näyttää olevan oikein. Ongelma on DIR komennossa jota INDEX käyttää. Niinpä REPLACE "-" komennolla korvaan kaikki "-" merkit blankolla. Aluksi yritin FORM komentoa niin, että siinä olisi neljä muuttujaa: <komento jolla tiedosto katsotaan> <Mjan nimi> / ja tavumäärä. Se aiheutti ongelmia, koska ensiksikin komento jolla tiedosto katsotaan oli tyypillisesti SHOW, mutta se saattoi olla FILE SHOW tai jotain muuta. Korvasin kaikki kaksiosaiset nimet tavuviivalla esim FILE_SHOW. Paljon suurempi ongelma olivat nimet joissa oli blankoja. Onneksi MM Survossa sukro muutti pitkät nimet lyhyiksi 8 merkin mittaisiksi nimiksi ja tämä ongelma pääasiassa ratkesi tällä. Ei kuitenkaan kokonaan sillä tätä lyhyempiäkin kahden sanan tiedostoja löytyi jostakin. Lisäksi jotkut hakemistojen nimet olivat niin pitkiä, että oli vaikea muodostaa FORM - komentoa. Itse en käytä pitkiä tiedostonnimiä enkä ikinä blankoja sisältäviä nimiä. En myöskään tee pitkiä hakemistonimiä, mutta kiintolevyille pakosta tulee toisten tekemiä tiedostoja, joiden nimiä ei voi hallita. Keksin sitten, että käytän INDEX komennossa olevaa "/" viivaa ankkurina. Onneksi Kimmo oli tuon jättänyt. Niinpä käytän REPLACE " /" "{r126}/",C{act} ja sen jälkeen puhdistan CLEAR komennolla kentän alusta 100 merkkiä. Kuvaruudulleni ei mahdu näkyviin FONT 10 määreellä yli 145 merkin levyisiä kenttiä. Jos tekee tuota pitempiä kenttiä, niin joutuu työntämään kuvaruutua oikealle. Se hidastaa toimintaa melko paljon. Tosin äsken kokeilin FONT 5 komentoa ja sillä pystyisi tekemään 300 merkin levyisiä kenttiä. Mutta minulle näyttää riittävän tuo 100 merkin poistaminen kentän alusta. Tämän jälkeen kentässä on enään "/" ja tavumäärä ja sen jälkeen voin käyttää FORM komentoa ja L+ komennolla voin laskea tavumäärän. Tämä toimii riittävän varmasti. Onneksi MM-survon sukroissa INDEX -komento lyhentää tiedostot 8 merkin mittaisiksi. Itse INDEX-komennon helpistä en löytänyt tällaista määrittelyä. Löysin ainoastaan allaolevan komennon, mutta sen käyttö olisi liian vaivalloista kun pitäisi ensiksi antaa pitkät nimet ja lyhyet tulisivat seuraavalle riville. Tässä help- järjestelmän antama tieto: "INDEX /SHORTNAME <long_file_name> converts the long file name to its short representation and writes the result on the next line. In errorneous situations, an empty line is written." Nyt kun sukro automaattisesti tekee tuon lyhyen version MM Survolla, niin ongelmani on ratkaistu, mutta kiinnostuksesta kysyisin, voiko INDEX - ohjelmalla saada lyhyet nimet ilman, että antaa pitkiä nimiä? Kaikenkaikkiaan nytkin 3.5 teran kiintolevyn läpikäyminen saattaa kestää tunninkin, mutta se ei ole ongelma kunhan ohjelma toimii muuten kohtuullisen hyvin. Ohjelma toimii täydellisesti niillä tiedostoilla ja hakemistoilla jotka olen itse tehnyt, mutta vieraiden tekemiin hakemistoissa ja tiedostoissa voi tulla jotain ongelmia joiden jälkeen joutuu käsin jatkamaan ohjelmaa, mutta tätä tapahtuu harvoin. Tämän jälkeen tein vielä tärkeimpien kiintolevyjen hakemistoista Survo-tiedostot niin että poimin hakemistojen nimet erikseen ja korvasin "/" merkit riittävän isolla blankomäärällä ja saatoin sen jälkeen tehdä saman minkä Kimmo on tehnyt LEVEL - määri- tyksellä. Sitä en ole vielä viitsinyt automatisoida. |
Administrator
|
Hei Markku,
Konstit on monet, kuten on Survon kanssa totuttu ajattelemaan. Tiedostojen ja hakemistojen hallinta on kaikkiaan Windowsissa aika sotkuista. SURVO MM ja SURVO R ovat tässä suhteessa erilaisia, koska SURVO R:ssä hyödynnetään funktioita, jotka toimivat sekä Windowsissa että Macissa (ja Linuxissa). Lyhyet nimet ovat Windows-alustan (ruma, väkisin lisätty) erikoisuus. Ja tosiaan: 1990-luvun lopulla ei tullut lainkaan varauduttua sellaisiin tiedostokokoihin, joita yli 20 vuotta myöhemmin esiintyy aivan yleisesti. Tälle ei oikein mahda enää mitään. Uskon, että sait jo varsin hyvin hommat toimimaan, mutta siltä varalta, että haluaisit kokeilla vielä vaihtoehtoja, tässä ehdotus Windowsin DIR-komennon käyttämiseksi. Komento on annettu Survon editorista, siksi alussa on väkänen. Loppupuolella oleva väkänen puolestaan ohjaa tulostuksen sen oikealla puolella annettuun tekstitiedostoon. Hakemistona tässä on (hieman vanhan) R:n muste-hakemisto, josta löytyvät Survo R -ohjelman tarvitsemat tiedostot: >DIR /X/S/N/-C/OGS C:\rlibs\3.6.3\muste > D:\DIR.TMP DIR-komennon vipuina olen kokeeksi käyttänyt seuraavia: /X = jos tiedostolle on lyhyt nimi, se lisätään riville ennen pitkää nimeä /S = alihakemistot (siis koko hakemistopuu) tulevat mukaan /N = listausmuoto, jossa pitkät tiedostonimet ovat laitimmaisena oikealla /-C = tuhaterottimet (blankot) jätetään pois tiedoston koosta /OGS = järjestetään niin, että alihakemistot ensin ja tiedostot suuruusjärjestyksessä Tämän hyvä puoli on se, että listaus syntyy erittäin nopeasti. Tässä näytteeksi vähän alkua äskeisen komennon tulosteesta (haettuna LOADP-komennolla Survo-kenttään): Directory of C:\rlibs\3.6.3\muste 03.12.2021 12.05 <DIR> . 03.12.2021 12.05 <DIR> .. 03.12.2021 12.05 <DIR> U 03.12.2021 12.05 <DIR> D 03.12.2021 12.05 <DIR> TUT 10.12.2021 09.06 <DIR> TMP 03.12.2021 12.05 <DIR> tklibs 03.12.2021 12.05 <DIR> EX 03.12.2021 12.05 <DIR> help 03.12.2021 12.05 <DIR> html 03.12.2021 12.05 <DIR> include 03.12.2021 12.05 <DIR> SYS 03.12.2021 12.05 <DIR> libs 03.12.2021 12.05 <DIR> M 03.12.2021 12.05 <DIR> S 03.12.2021 12.05 <DIR> Meta 03.12.2021 12.05 <DIR> R 03.12.2021 12.05 <DIR> web 03.12.2021 12.05 <DIR> Q 03.12.2021 12.05 <DIR> OPETUS 03.12.2021 12.05 198 NAMESP~1 NAMESPACE 03.12.2021 12.05 223 INDEX 03.12.2021 12.05 310 DEMOS.EDT 03.12.2021 12.05 663 DESCRI~1 DESCRIPTION 03.12.2021 12.05 1328 START.EDT 03.12.2021 12.05 1328 ESTART.EDT 03.12.2021 12.05 1328 SSTART.EDT 03.12.2021 12.05 1758 MUSTEG~1.PDF musteguide.pdf 03.12.2021 12.05 1856 SURVO.APU 03.12.2021 12.05 4950 SOFT.TUT 03.12.2021 12.05 5339 CRT.EDT 03.12.2021 12.05 37544 NEWS 03.12.2021 12.05 40832 MD5 03.12.2021 12.05 51860 SUR-SOFT.EDT 03.12.2021 12.05 58200 SUR_SOFT.EDT 15 File(s) 207717 bytes Directory of C:\rlibs\3.6.3\muste\D 03.12.2021 12.05 <DIR> .. 03.12.2021 12.05 <DIR> . 03.12.2021 12.05 1943 MSQPLOT.EDT 03.12.2021 12.05 8806 DECA.SVO 03.12.2021 12.05 31878 SPOINT.EDT 03.12.2021 12.05 62096 KUNNAT.SVO 4 File(s) 104723 bytes Uskoisin, että tätä pystyy sukrolla jatkokäsittelemään varsin kätevästi. Ja isoimmatkin tiedostokoot ovat tässä oikein! :) terv. Kimmo |
Administrator
|
Hei,
Tässä vielä toinen näkymä samalla DIR-komennolla, kohteena C:\rlibs\4.1.2 -hakemisto, ja tähän poimittuna vain tiedoston viimeiset rivit. Aivan lopussa näkyy myös vapaan levytilan määrä ko. levyllä: 194869694464 tavua, jonka voimme tuttuun Survo-tapaan ilmaista myös sanoin: 194869694464(10:sanoin)=sata yhdeksän kymmentä neljä miljardia kahdeksan sataa kuusi kymmentä yhdeksän miljoonaa kuusi sataa yhdeksän kymmentä neljä tuhatta neljä sataa kuusi kymmentä neljä Lisäsin tulosteen yläpuolelle apurivit, joiden avulla nähdään muun muassa, että tiedoston (pitkä) nimi alkaa aina sarakkeesta 50 ja tiedoston koko on tasattu oikealle, sarakkeeseen 35. 1 2 3 4 5 6 7 123456789012345678901234567890123456789012345678901234567890123456789012... 08.12.2021 14.46 2684 TEST_Y~2.R test_yaml_load_file.R 08.12.2021 14.46 12315 TEST_A~1.R test_as_yaml.R 08.12.2021 14.46 20338 TEST_Y~1.R test_yaml_load.R 5 File(s) 36679 bytes Directory of C:\rlibs\4.1.2\yaml\tests\files 08.12.2021 14.46 <DIR> .. 08.12.2021 14.46 <DIR> . 08.12.2021 14.46 179 test.yml 08.12.2021 14.46 395 merge.yml 2 File(s) 574 bytes Total Files Listed: 4912 File(s) 192472080 bytes 2993 Dir(s) 194869694464 bytes free |
Administrator
|
Vielä yksi lisäys, kun huomasin, että Markun varsinainen tarkoitus oli oikeastaan saada hakemistoittaiset tiedot levytilan käytöstä. Tässä yksi konsti käyttäen Survon mainiota LINEDEL-toimintoa:
1. Haetaan edellä saatu tulostiedosto toimituskenttään (varattava tarpeeksi rivejä) 2. Poistetaan siitä rivit, joissa esiintyy hakemiston nimi ja talletetaan ne DIRS-nimiseen kenttään: LINEDEL CUR+1,END,"Directory of" / DEL_SAVE=DIRS 3. Haetaan tulostiedosto uudelleen toimituskenttään 4. Poistetaan siitä rivit, joissa esiintyy hakemiston tiedostojen yhteiskoko ja talletetaan ne FILES-nimiseen kenttään: LINEDEL CUR+1,END,"File(s)" / DEL_SAVE=FILES Sen jälkeen on helppo muodostaa esim. datatiedosto, jossa nämä tiedon sirpaleet kohtaavat. t. Kimmo |
Administrator
|
En voinut välttää kiusausta jatkaa tätä tarinaa, kun kerran aloitin - Survolla on niin hauskaa tehdä tällaisia.
Paketoinnin sukroksi jätän kuitenkin Markulle, joka tietenkin osaa sen suvereenisti. Tässä siis jatkoa edellä tehtyyn, jossa hyödynnettiin LINEDEL-operaatiota: Talletetaan edellä saadut tiedot tekstitiedostoiksi: SAVEP CUR+1,END-1,BYTES.TXT / FILES-kentässä SAVEP CUR+1,END, DIRS.TXT / DIRS-kentässä Ne näyttävät tällaisilta (5 ensimmäistä havaintoa ladattuna kenttään): SHOW BYTES.TXT 0 File(s) 0 bytes 11 File(s) 801310 bytes 5 File(s) 3076 bytes 2 File(s) 2695 bytes 0 File(s) 0 bytes SHOW DIRS.TXT Directory of C:\rlibs\4.1.2 Directory of C:\rlibs\4.1.2\askpass Directory of C:\rlibs\4.1.2\askpass\help Directory of C:\rlibs\4.1.2\askpass\html Directory of C:\rlibs\4.1.2\askpass\libs Siirretään kahdeksi eri datatiedostoksi: FILE SAVE BYTES.TXT TO NEW BYTES FILE SHOW BYTES FILE SAVE DIRS.TXT TO NEW DIRS / VARLEN=70 FILE SHOW DIRS Tarkistetaan ja päivitetään rakenteita: (passivoidaan turhia muuttujia ja nimetään paremmin tarpeellisia) FILE STATUS BYTES Copied from text file BYTES.TXT FIELDS: (active) 1 NA_ 2 X1 X1 (###) 2 SA_ 7 X2 X2 3 NA_ 8 X3 X3 (########) 4 SA_ 5 X4 X4 END Survo data file BYTES: record=47 bytes, M1=9 L=64 M=4 N=998 FILE UPDATE BYTES Copied from text file BYTES.TXT FIELDS: (active) 1 NA_ 2 Files X1 (###) 2 S-_ 7 X2 X2 3 NA_ 8 Bytes X3 (########) 4 S-_ 5 X4 X4 END FILE STATUS DIRS Copied from text file DIRS.TXT FIELDS: (active) 1 SA_ 9 X1 X1 2 SA_ 2 X2 X2 3 SA_ 70 X3 X3 END Survo data file DIRS: record=121 bytes, M1=7 L=70 M=3 N=998 FILE UPDATE DIRS Copied from text file DIRS.TXT FIELDS: (active) 1 S-_ 9 X1 X1 2 S-_ 2 X2 X2 3 SA_ 70 Dir X3 END Tehdään vastaavat muuttujat toiseen dataan: VAR Files:2=MISSING TO DIRS VAR Bytes:8=MISSING TO DIRS Päivitetään sen aktiivisten muuttujien kuvaukset: FILE UPDATE DIRS Copied from text file DIRS.TXT FIELDS: (active) 3 SA_ 70 Dir Directory name (path) 4 NA- 2 Files Number of files in directory 5 NA- 8 Bytes Total bytes of the files in the directory (#########) END Survo data file DIRS: record=121 bytes, M1=7 L=70 M=5 N=998 ...................... Kopioidaan lopulta tiedot samaan dataan: FILE COPY BYTES TO DIRS / MATCH=# VARS=Files,Bytes FILE SHOW DIRS ...................... Ladataan kenttään 10 eniten tilaa vievää hakemistoa: FILE SORT DIRS BY -Bytes TO DIRS2 ....................... FILE LOAD +DIRS2 CUR+2 / SELECT=ORDER,1,10 Dir Files Bytes C:\rlibs\4.1.2\stringi\libs 3 28686315 C:\rlibs\4.1.2\stringi\libs\i386 2 5790954 C:\rlibs\4.1.2\stringi\libs\x64 2 5124673 C:\rlibs\4.1.2\Rcpp\include\Rcpp\module 21 3979874 C:\rlibs\4.1.2\curl\libs\i386 2 3829769 C:\rlibs\4.1.2\curl\libs\x64 2 3739657 C:\rlibs\4.1.2\openssl\doc 13 3135278 C:\rlibs\4.1.2\openssl\libs\i386 2 2970967 C:\rlibs\4.1.2\openssl\libs\x64 2 2964287 C:\rlibs\4.1.2\xml2\libs\i386 2 2502826 ................................... Tai 10 eniten tiedostoja sisältävää hakemistoa: FILE SORT DIRS BY -Files TO DIRS3 .................................... FILE LOAD +DIRS3 CUR+2 / SELECT=ORDER,1,10 Dir Files Bytes C:\rlibs\4.1.2\cli\help\figures 138 574129 C:\rlibs\4.1.2\colorspace\hclwizard\www\images 99 11763 C:\rlibs\4.1.2\knitr\themes 85 26324 C:\rlibs\4.1.2\data.table\tests 65 500917 C:\rlibs\4.1.2\Rcpp\include\Rcpp\sugar\functions 51 284707 C:\rlibs\4.1.2\Rcpp\include\Rcpp 50 241834 C:\rlibs\4.1.2\Rcpp\tinytest 47 261836 C:\rlibs\4.1.2\Rcpp\include\Rcpp\traits 42 76672 C:\rlibs\4.1.2\rmarkdown\rmd\slidy\Slidy2\graphics 40 131319 C:\rlibs\4.1.2\Rcpp\tinytest\cpp 39 175864 ....................................... |
Olen saanut jo lähes kaikki levyt kahlattua läpi tekemilläni sukroilla.
Mutta jos haluaisinkin tehdä tuota systemaattisesti useamminkin, nopeutukset olisivat paikallaan. Melko ovelia temppuja olet keksinyt. Kiitos paljon noista näppäristä vihjeistä. Niitä täytyy kyllä kokeilla. |
Hei Kimmo. Kiitos vielä vihjeestäsi. Siitä oli minulle paljon iloa.
Tein nyt uuden version ohjelmastani käyttämällä ehdottamaasi Dir -komentoa. Se yksinkertaisti kovasti sukroani ja ohjelmani nopeutui kovasti. Nyt 3.6 teran kiintolevy, jossa on noin 2700 hakemistoa ja 376000 tiedostoa meni läpi 28 minuutissa, kun siihen aikaisemmin meni aikaa noin tunti. Sukro typistyi melko pieneksi. Olennaisena osana siinä on edelleen sinun TREE-ohjelmasi, jonka avulla haen alihakemistot, jotka ovat alekkain listana. Luulenpa, että olen tällä hetkellä ainoa joka käyttää aktiivisesti TREE komentoa ja on innostunut siitä kovasti, vaikkakin haen sen avulla vain kiintolevyn alihakemistot enkä käytä sitä tiedostojen koon mittaamisessa:) Sitten vain käyn alihakemisto kerrallaan DIR -komennolla läpi hakemistoja, etsin niistä File(s) sanan ja sen edestä poimin tiedostojen lukumäärän ja sen takaa tavujen määrän ja siirrän ne listauksessa etsittävänä olevalle hakemistoriville ja siirryn yhtä riviä alemmaksi. Tuo DIR komento on siitä parempi kuin INDEX - että se ei jää jumiin vaikka tietyssä alihakemistossa ei olisi lainkaan tiedostoja. Aikaisemmin jotkut hakemistot kuten esim. SYSTEM~1 aiheuttivat ongelmia ja tekemäni error_handler:kään ei niihin pystynyt. Tuo DIR -komento ei näytä jumiutuvan lainkaan. Mitä luulet, nopeutuuko sukro, jos sen ei tarvitse päivittää kuvaruutua jatkuvasti ja onko kuvaruudun lukitseminen mahdollista? Jotenkin muistelen Sepon joskus puhuneen siitä, mutta en ole varma. |
Administrator
|
hei Markku,
Hauska kuulla, että sait sukroa nopeutettua. Suosittelen {disp off} -koodin käyttöä. Luultavasti se nopeuttaa vielä toimintaa. t. Kimmo |
In reply to this post by Kimmo Vehkalahti
Nyt vasta tajusin tuon koko systeemisi komeuden. Tuota Dir -komentoa ei kannatakaan antaa alihakemistoille erikseen, vaan koko kiintolevylle, esim D:\ Tämä näyttää tulostavan tosiaan kaikki alihakemistot. Ja sitten kannattaa toimia LINEDEL -komentojen ja kahden tiedoston avulla ja niiden yhdistämisen avulla. Sehän tekee tuosta todella nopeaa!
|
Administrator
|
No hyvä! :)
Kokeilin itsekin D-levylläni (reilut 100 000 tiedostoa lähes 9 000 hakemistossa). DIR-komento vie vain pari sekuntia, ja se tuottaa lähes 8 megatavun kokoisen tekstitiedoston, jossa on n. 125 000 riviä). LINEDEL on myös erittäin nopea, samoin nuo FILE-operaatiot. t. Kimmo |
Free forum by Nabble | Edit this page |