Ohjelmoin kesäpäivien ratoksi lämpömittariohjelmaa C++ ja wxWidgets -yhdistelmällä. Ohjelman olisi määrä toimia sekä Linuxilla että Windowsilla. Runko on jo valmis - päätoiminnoista puuttuu enää tilastojen katselu, josta siitäkin on jo kuvaajanpiirto valmis. Kuitenkin lämpötiladatan tallentaminen ja kaivaminen kuvaajaan piirrettäväksi on kohta, jossa pyytäisin teiltä neuvoja.
Tavoitteena on, että käyttäjä voi katsella lämpötilakäyrää 1) päivän mukaan, jolloin näytetään tuntien keskiarvot 2) kuukauden mukaan, jolloin näkyy päivien keskiarvot ja 3) vuoden mukaan, jolloin tietenkin näkyy kuukausien keskiarvot.
Tietojen tallentamiseen lienee kaksi vaihtoehtoa: tekstitiedosto tai tietokanta. Lämpötilaa mitataan n. puolen minuutin välein, joten dataa voi kertyä runsaastikin. Tekstitiedoston ajattelin olevan yksinkertaisesti muotoa aikaleima lämpötila, esimerkki:
1183054704 15.0 1183054709 15.0 1183054714 15.0
Kuitenkin tälläisesta on aika inhottava kaivaa tietoja (onko ehdotuksia säiliörakennelmaksi?)
Toinen vaihtoehto, eli tietokanta, olisi hyvä suurehkon (?) datamäärän takia. Kuitenkin projekti on muuten pienehkö, alle 1000 riviä koodia, joten tietokanta tuntuu liioittelulta. Lisäksi ongelmoin monialustatukea sekä pyrin minimoimaan käyttäjälle aiheutuvat lisälataukset tietokantakirjastojen jne. muodossa. Katselemani sqlite3 ei taida sisältää kummoisia päiväysfunktioita, mitä googlasin :O
Toivottavasti joku jaksaa lukea läpi, apua kaivataan.
Päivässä kertyy siis 24 * 60 * 2 = 2880 mittaustulosta, ja vuodessa kertyy noin 360 * 2880 = 1036800 mittaustulosta. Ohjelmoinnin kultaisen säännön mukaan "miljoona on vähän", joten ohjelma ehtii käsitellä vaikka koko vuoden mittaustulokset yhdessä hujauksessa. Mutta ehkä olisi järkevää pitää erikseen kirjaa päivän tuntien, kuukauden päivien ja vuoden kuukausien keskiarvoista, jotta niitä ei tarvitse laskea jatkuvasti uudestaan.
Joka tapauksessa tavalliset tekstitiedostot riittävät luultavasti mainiosti. Uusia mittaustuloksia on helppo lisätä tiedoston jatkoksi, ja tietojen käsittelynkään ei pitäisi olla kovin monimutkaista, kun tekee kunnolliset aliohjelmat. Tietokannasta ei olisi edes paljon hyötyä, koska jos pitää laskea suuren määrän lukuja keskiarvo, ei siihen ole tietokannassakaan mitään oikotietä, vaan täytyy laskea kaikki luvut yhteen ja jakaa tulos niiden määrällä.
Eikö tuo nyt kannattaisi tallentaa binääri muodossa eikä mihkään tekstitiedostoon?
Datan käsittely helpompaa kun se on valmiina oikeassa muodossa eikä tarvitse muutella. Ja tilaakin kuluu vähemmän. Jos oikein laskin niin tuo yksi rivi tekstiä vie 16 tavua kun saman saa tallennettua 6 tavuun.
4 tavua aikaleimalle ja 2 tavua lämpötilalle.
Lahha kirjoitti:
Eikö tuo nyt kannattaisi tallentaa binääri muodossa eikä mihkään tekstitiedostoon?
Ihan hyvä pointti, mutta on mukavampaa kun vielä raakilevaiheessa voi itse helposti syynäillä tiedostoa. Pitää muuttaa binäärimuotoon kunhan saan tämän systeemin pelaamaan. Datan käsittely nyt on ihan helppo juttu, ja float vie muuten myös 4 tavua.
Ohjelman sisäinen toteutus lienee näppärintä tehdä assosiaatiotaululla.
Juice kirjoitti:
float vie muuten myös 4 tavua.
Mitä sinä floatilla? Jos mittaustulos on vaikkapa kahden desimaalin tarkkuudella, saa shortilla näppärästi tallennettua arvot [-327.68, 327.67]. Jos vaikka kokoaisit noita sitten eri tiedostoihin vaikkapa niin, että yhden viikon tulokset ovat aina yhdessä tiedostossa, niin eivät tiedostotkaan paisuisi kovin suuriksi... Vaikka eipä tuo datamäärä päätä huimaa. ;)
Metabolix kirjoitti:
Jos mittaustulos on vaikkapa kahden desimaalin tarkkuudella, saa shortilla näppärästi tallennettua arvot [-327.68, 327.67].
Hyvä huomio. Loppujen lopuksi päädyin kuitenkin sqliteen, vaikka lisäkirjastot jonkin verran bloattaavatkin. Tallennettavaa dataa alkoi vaan olemaan turhan moneen tiedostoon ja olisi pitänyt jotakin indeksointisysteemiä kehitellä, joten tietokannan avulla pääsee vähimmällä koodimäärällä (lue: purkalla). Alkoi painajaismaisesti hiipiä mieleen ajat, jolloin kotisivutilani oli MBNetin palvelimella :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.