On while silmukka joka käydään läpi miljoonia kertoja, niin kannattaako tiedostoon tallennettava ottaa muuttujaa ja sitten lopuksi kirjoittaa tiedostoon vai joka läpikäymisen yhteydes?
Siis millä tavalla tiedostoon tallennus on mahdollisimman nopeaa?
Kyseessä on jotain 100Mt mitä ohjelma tuottaa tietoa.
Siis millä tavalla tiedostoon tallennus on mahdollisimman nopeaa?
Kyseessä on jotain 100Mt mitä ohjelma tuottaa tietoa.
Vastaukset 12
Vanhimmat
"kannattaako tiedostoon tallennettava ottaa muuttujaa ja sitten lopuksi kirjoittaa tiedostoon vai joka läpikäymisen yhteydes?"
Ymmärrän tuo niin, että kysyt kannattaako jokin operaatio tehdä kerran vai miljoonia kertoja. Sitäkö kysyt? Jos kysyt, niin vastaus lienee aika selvä. Jos taasen et, niin selitä vähän enemmän mitä olet tekemässä.
*Ymmärrän tuo niin, että kysyt kannattaako jokin operaatio tehdä kerran vai miljoonia kertoja. Sitäkö kysyt? *
Periaatteessa kyl. Siis tallennanko paljon tietoa pienenpienissä paloissa loopissa vai keräänkö loopissa palat muuttujaan ja lopuksi länttäsen tiedostoon isonkasan tietoa.
Tuota puskurihommaa tarkoitin mikä selvis tuol toises viestis. Viel vähän hakuses nämä hienot sanat, ja tulee selitettyä liian monimutkasesti yksinkertaisia asioit.
Jos tarkoitit jotain puskurin omaista ratkaisua, niin toki sellainen on nopeampi. En ole C :aa käyttänyt, mutta siinä näyttäisi löytyvän valmiiksi tiedosto puskuri, aivan kuten muissakin olio kielistä:
http://www.cplusplus.com/ref/iostream/streambuf/pubsetbuf.html
Kun kirjoitat tiedostoon, niin se menee puskuriin ja kun puskuri on täynnä tai käytetään flush komentoa, niin vasta tällöin data kirjoittuu fyysisesti levylle. Mitä isompi puskuri niin sitä nopeammin tallennus tapahtuu.
Lyhyesti siis, käytä sellaista tiedostoon kirjoitus metodia joka osaa puskuroida datan.
Ensinnäkin kiitos todella paljon, tuolla ohjelma nopeutu huomattavasti.
Tuon esimerkin mukaan menee nyt tallennus
http://www.cplusplus.com/ref/cstdio/setbuf.html
Mutta tuossa on viel pieni ongelma. Mitenkäs saam muuttujan sisällön tiedostoon?
Ennen
int x = 232323;
myfile
En olen ihan varma, mutta:
fwrite((void *) &x , 1 , sizeof(x) , pFile1);
Jos arvo taas pitää tallentaa tekstinä, niin silloin käyttää sprtinf:ää ensin. En nyt ihan varma ole.
Elikkä C :n tiedosto virrassa näyttäisi oletuksena olevan olevan jo jonkinlainen puskuri. Alla esimerkki sen muuttamisesta:
--- TIEDOSTO ALKAA ---
#include
#include
#define PUSKURIN_KOKO 100000
int main(int argc, char **argv)
{
int x = 10;
char puskuri[PUSKURIN_KOKO];
std::ofstream myFile("teso.txt");
myFile.rdbuf()->pubsetbuf(puskuri, PUSKURIN_KOKO);
myFile
Huomaa, että puskuri voi olla tässä yhteydessä ainakin kahdessa eri merkityksessä. C :ssa on oma puskuri virran osalta ja käyttöjärjestelmässä oma eri tapauksia varten (terminaalin, tiedostojärjestelmän, kovalevyn). Kannattaa siis tutustua myös oman alustan dokumentaatioon.
Alustana on WinXp mille tuo softanen tulee. Kerroppa lisää jos tiedät.
Eikös nuo tiedostojärjestelmän jne... puskurit hoida automaattisesti käyttöjärjestelmä?
Täytyypä yrittää Googlettaa jotain tuohon aiheeseen.
Kiitoksia tuolla toimii. Vielä semmoinen kysymys miten määritellään optimaalinen puskurin koko?
Mitä suurempi puskurin koko on, niin sitä nopeammin homma yleensä toimii. Käytännössä puskurin koko kannattaa olla jokin levyn "varausyksikön" kerrannainen, eli yksikön jossa käyttöjärjestelmä käsittelee levyä. Tämän "varausyksikön" koko riippuu siitä miten levy on alustettu ja mikä tiedostojärjestelmä on käytössä. jne. Mitään yksi selitteistä arvoa hyvälle puskurin koolle ei voi sanoa. Mutta kokeilemalla se selviäisi parhaiten.
Kirjoitus/luku nopeus riippuu myös tiedosto järjestelmän pirstaloitumis asteesta. Jos esimerkiksi "varausyksikön" koko on 4 kT, niin silloin 100 MT tiedosto muodostuu 25000 yksiköstä. Jos pirstaloitumisaste olisi 100%, niin tällöin lukupään paikkaa jouduttaisiin korjaamaan 25000 kertaa. Jos tämä ylimääräinen lukupään siirto veisi aikaa 7 ms, niin tällöin (100% pirstaloituminen) hidastaisi 100 Mt:n lukua/kirjoitusta 25000*7 ms = n. 3 minuutilla.
Itse levyssä voi olla omat puskurit, jne. Jos kuitenkin ajatellaan, että käyttöjärjestelmäsi antaisi ohjelmallesi levyaikaa 1/4 ajasta, niin tällöin ei ole hyötyä siitä jos puskuri on isompi kuin [1/4]*[Kovalevyn siirto nopeus].
Voi olla, että noissa esimerkki laskuissa meni joku pieleen, (siis jäi huomioimatta), kun en asiaan ole perehtynyt.
Kuinka kauan sen tiedoston luonti kestää sillä ohjelmalla tällä hetkellä?
Tiedoston koko 103 MB ja 23 Sek menee aikaa koko ohjelman suorittamiseen. Vastaavasti 2.33MB tiedostoon menee 6 Sek.