Owner of DBIT Consultancy | DJ BassBrewer
We hebben een STN, WDSP (windspeed) en TIME (timestamp). Op Time zit een index. (ensureIndex).Mike2k schreef op woensdag 16 november 2011 @ 11:48:
Hoe is je DB layout?
Kan je niet een key zetten op de windsnelheid?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Als ik alle records van de laatste 6 uur opsla voor elk station dan zitten we op 172 miljoen rijen. Dat is niet meer bepaald snel als je de 50 snelste windsnelheden wilt opvragen.DennusB schreef op woensdag 16 november 2011 @ 11:50:
[...]
Ja sorry, dat zie ik nu ook inderdaad. Dan zou ik gewoon wel alle waardes opslaan, met een max levensduur per record van 6 uur. Is ie ouder dan 6 uur? Dan gooit ie het record weg. Zo blijft je tabel 'schoon' en snel!
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Verwijderd
Dat zou wel mee moeten vallen hoor. Wat is "niet bepaald snel"?ZpAz schreef op woensdag 16 november 2011 @ 11:52:
[...]
Als ik alle records van de laatste 6 uur opsla voor elk station dan zitten we op 172 miljoen rijen. Dat is niet meer bepaald snel als je de 50 snelste windsnelheden wilt opvragen.
You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.
Nah een beetje flinke database-server(s) met goede configuratie en goed tabel design moet dat makkelijk aankunnen!ZpAz schreef op woensdag 16 november 2011 @ 11:52:
[...]
Als ik alle records van de laatste 6 uur opsla voor elk station dan zitten we op 172 miljoen rijen. Dat is niet meer bepaald snel als je de 50 snelste windsnelheden wilt opvragen.
Owner of DBIT Consultancy | DJ BassBrewer
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
En wat is dan een goed tabel design. We hebben het hier over mongo. Daar heb je geen relaties enzo. Daarnaast is het ook nog eens één tabel, daaraan kan je weinig designen.DennusB schreef op woensdag 16 november 2011 @ 11:53:
[...]
Nah een beetje flinke database-server(s) met goede configuratie en goed tabel design moet dat makkelijk aankunnen!
We hebben 25 seconden de tijd. Maar dat redden we niet.
edit: Het is een school opdracht, we hebben niet de resources om er een cluster aan servers heen te gooien.
Na een paar uurtjes draaien zitten we al tegen de 30GB aan data.
Elke seconde per station.Komen de metingen eigenlijk met een vaste interval of random ?
[ Voor 13% gewijzigd door ZpAz op 16-11-2011 11:58 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Verwijderd
Dan zou ik optimaliseren.ZpAz schreef op woensdag 16 november 2011 @ 11:53:
We hebben 25 seconden de tijd. Maar dat redden we niet.
Nog even terug naar het sliding window. Je zegt dat je de hoogste waarde in de afgelopen 6 uur wilt, maar is dat per uur of wat? Want dan kun je toch per (klok)uur de hoogste waarde opslaan en later steeds Min([x-5..x]) terugkijken?
Dankje, zover was ik. Maar hoe
De hoogste windsnelheid binnen de afgelopen 6 uur.Nog even terug naar het sliding window. Je zegt dat je de hoogste waarde in de afgelopen 6 uur wilt, maar is dat per uur of wat? Want dan kun je toch per (klok)uur de hoogste waarde opslaan en later steeds Min([x-5..x]) terugkijken?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
wat is de interval van metingen? is die vast of niet ?
You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.
Sorry dan snap ik je vraag niet. Is je vraag: "komen alle metingen op zelfde tijdspannes ertussen binnen" dan ja. Elke seconde komt er een meting voor elke 8000 stations binnen. Tussen elke meting per station zit dus één seconde.Mike2k schreef op woensdag 16 november 2011 @ 11:57:
ja...maar per das geen antwoord op de vraag van negertjezoen en mij...
wat is de interval van metingen? is die vast of niet ?
[ Voor 5% gewijzigd door ZpAz op 16-11-2011 12:01 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Verwijderd
Snelste windsnelheid is volgens mij een pleonasme, juister zou zijn: 'Hoogste windsnelheid'
Ik zeur nogmaal niet over taal, maar ik wil je deze kleine tip niet onthouden aangezien je misschien wel een lagere score zou kunnen krijgen.
Het staat op een HDD. In het geheugen past niet. We hebben maar 4GB ram.mux schreef op woensdag 16 november 2011 @ 12:02:
Ik zou toch het probleem dan een beetje in je server zoeken. Zitten je samples in werkgeheugen of in een database on disk? Een sort uitvoeren op data in geheugen moet met honderden megasamples per seconde gaan, en sort is orde N log n. Je kunt kijken naar een ander sort-algoritme gezien je data een duidelijke structuur heeft (naar ik aanneem), of je data hiërarchisch sorteren.
Al deze drie punten worden uitgevoerd.
ThanksVerwijderd schreef op woensdag 16 november 2011 @ 12:04:
Omdat het voor een schoolproject gaat:
Snelste windsnelheid is volgens mij een pleonasme, juister zou zijn: 'Hoogste windsnelheid'
Ik zeur nogmaal niet over taal, maar ik wil je deze kleine tip niet onthouden aangezien je misschien wel een lagere score zou kunnen krijgen.
[ Voor 20% gewijzigd door ZpAz op 16-11-2011 12:06 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Dan laad je telkens een slice van je DB in geheugen, sorteert en gaat door naar de volgende slice. Daarna sorteer je de uitkomsten van iedere slice. Dat is een hiërarchische sort (of reverse bin sort).ZpAz schreef op woensdag 16 november 2011 @ 12:05:
[...]
Het staat op een HDD. In het geheugen past niet. We hebben maar 4GB ram.
In SQL zou je dat op deze manier doen:Nu willen we de snelste meting per station ophalen van de afgelopen 6 uur.
1
2
3
4
5
6
| SELECT MAX(snelheid), station FROM tabel WHERE tijd >= (NOW() - INTERVAL '6 HOUR') GROUP BY station; |
Zoiets moet je in MongoDB toch ook kunnen doen?
http://www.mongodb.org/display/DOCS/Aggregation
Ja hoor, ware het niet dat het veel te traag is.cariolive23 schreef op woensdag 16 november 2011 @ 12:07:
[...]
In SQL zou je dat op deze manier doen:
SQL:
1 2 3 4 5 6 SELECT MAX(snelheid), station FROM tabel WHERE tijd >= (NOW() - INTERVAL '6 HOUR') GROUP BY station;
Zoiets moet je in MongoDB toch ook kunnen doen?
http://www.mongodb.org/display/DOCS/Aggregation
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Verwijderd
Nee dat bedoelen we niet, toch Mike2k?ZpAz schreef op woensdag 16 november 2011 @ 11:59:
[...]
Sorry dan snap ik je vraag niet. Is je vraag: "komen alle metingen op zelfde tijdspannes ertussen binnen" dan ja. Elke seconde komt er een meting voor elke 8000 stations binnen.
Als je om 12:07:52 kijkt, wil je dan data van 6:07:52 tot nu, of van 6:00 tot 12:00. In dat eerste geval zul je moeten optimaliseren, in het tweede geval kun je per klokuur de hoogste waarde opslaan (dus van 6:00 tot 7:00, van 7:00 tot 8:00 etc), en later 6 uren terugkijken. Heel simpel.
Helaas niet. 6 uur aan data loopt in de vele GB's.Hercul3s schreef op woensdag 16 november 2011 @ 12:08:
Is het geen mogelijkheid om je RAM zover uit te breiden dat de hele 6u database daarin past en met de snelheidswinst onder de 25 secs komen?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
je tabel heeft 3 kolommen: tijd,station,snelheid, de eerste datetime, de laatste twee integers
Primary key (tijd,station)
Secondary key (station,snelheid)
- met bulk-inserts zijn 8000 inserts makkelijk te halen
- elke seconde de 8000 records die ouder zijn dan 6 uur overzetten naar een archieftabel of verwijderen ook
- de query SELECT station,MAX(snelheid) GROUP BY station is heel snel
-> verondersteld dat je de 50 beste tijden zoekt van de voorbije 6 uur.
Hoeveel te traag loop je nu?
Ook al hebben we nog geen 6 uur aan data. Dan is het ook al te langzaam. (+- 3 uur).GlowMouse schreef op woensdag 16 november 2011 @ 12:11:
Heb je de data ouder dan 6 uur nog nodig? Ik denk even aan MySQL/InnoDB, waar je makkelijk dit makkelijk mee kunt doen:
je tabel heeft 3 kolommen: tijd,station,snelheid, de eerste datetime, de laatste twee integers
Primary key (tijd,station)
Secondary key (station,snelheid)
- met bulk-inserts zijn 8000 inserts makkelijk te halen
- elke seconde de 8000 records die ouder zijn dan 6 uur overzetten naar een archieftabel of verwijderen ook
- de query SELECT station,MAX(snelheid) GROUP BY station is heel snel
Het eerste inderdaad.Verwijderd schreef op woensdag 16 november 2011 @ 12:09:
[...]
Nee dat bedoelen we niet, toch Mike2k?
Als je om 12:07:52 kijkt, wil je dan data van 6:07:52 tot nu, of van 6:00 tot 12:00. In dat eerste geval zul je moeten optimaliseren, in het tweede geval kun je per klokuur de hoogste waarde opslaan (dus van 6:00 tot 7:00, van 7:00 tot 8:00 etc), en later 6 uren terugkijken. Heel simpel.
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Oh, je had al met InnoDB en de door mij genoemde tabellay-out getest?ZpAz schreef op woensdag 16 november 2011 @ 12:14:
[...]
Ook al hebben we nog geen 6 uur aan data. Dan is het ook al te langzaam. (+- 3 uur).
Edit: Dit eventueel doorvoeren (per 2 minuten, per 4 minuten etc) totdat je binnen 25 secs de data kan berekenen.
Je verliest hier natuurlijk wel aan accuratesse, maar aan de andere kant blijf je binnen een zeer klein timeframe (1 tot 4 minuten).
[ Voor 51% gewijzigd door Hercul3s op 16-11-2011 12:16 . Reden: Toevoeging ]
En waar heb je dan de index op gemaakt? Voor een SQL database ligt de combinatie datumtijd-station-snelheid voor de hand, dan is er maar heel weinig data nodig om de query te verwerken: Per station is maar één snelheid relevant, de hoogste. En omdat indexen vaak zijn gesorteerd (BTREE), kan de database hier heel snel doorheen vliegen.ZpAz schreef op woensdag 16 november 2011 @ 12:08:
[...]
Ja hoor, ware het niet dat het veel te traag is.
Ik werk ook op een database met miljarden records, maar dit soort queries gaat echt in milliseconden, niet eens in seconden. Ik heb wel véél meer RAM tot m'n beschikking, dat maakt ongetwijfeld verschil.
Heeft MongoDB niet een soort van EXPLAIN om te zien hoe de query wordt uitgevoerd en waar de pijnpunten zitten?
Ps. Ik ben een SQL dba, praat dus met deze kennis in m'n achterhoofd.
Hang je vast aan de keuze?
Wat doe je nog meer?
Is het puur de query tijd die je nu noemt? (gooi er eens een explain tegenaan)
Moet alles in de query gebeuren?
En net zo belangrijk: Wat is de achterliggende opdracht/informatie die je hebt gekregen? Over welk vak hebben we het? Wat hoor jij te weten?
Met die index heb je alle data van de afgelopen 6 uur nodig om de query te verwerken.cariolive23 schreef op woensdag 16 november 2011 @ 12:18:
[...]
En waar heb je dan de index op gemaakt? Voor een SQL database ligt de combinatie datumtijd-station-snelheid voor de hand, dan is er maar heel weinig data nodig om de query te verwerken: Per station is maar één snelheid relevant, de hoogste. En omdat indexen vaak zijn gesorteerd (BTREE), kan de database hier heel snel doorheen vliegen.
Is snelheid een int of double type? Zo niet dan maak er een double van.SELECT top(50)
MAX(snelheid),
station
FROM tabel
WHERE tijd >= (NOW() - INTERVAL '6 HOUR')
GROUP BY station;
Op tijd/snelheid/station moet een index komen, het liefst in combinatie.
Nu zou je query gewoon moeten werken binnen een seconde.
Mocht de index niet helpen, ga voor een andere database, elke normale database kan dit soort dingen standaard.
[ Voor 7% gewijzigd door dotcode op 16-11-2011 12:26 ]
station, 16 bits (plek voor 16384 stations)
tijd, 32 bits (unix timestamp)
windsnelheid: 32 bits (float)
Dat is 80 bits per meting => 10 bytes.
Na 6 uur heb je 8000*6*3600=172.800.000 metingen.
Dat is 172800000*10 bytes => 1687500 kilobytes => 1648 megabytes => 1.6GB.
Dat lijkt me behapbaar om in memory te doen.
Als je data na 6 uur waardeloos is, is downtime ook niet zo erg (voor zover ik dat voor je kan bepalen) Eventueel dump je per kwartier/uur naar disk.
Of zie ik iets over het hoofd?
Volgens de opdracht mocht je ineens geen "relationele database" meer gebruiken.Miyamoto schreef op woensdag 16 november 2011 @ 12:21:
Waarom is er voor MongoDB gekozen?
Te weinig tijd om er van af te stappen.Hang je vast aan de keuze?
We krijgen de gegenereerde data in XML formaat. Zelf een Java servertje geschreven welke het in MongoDB stopt. Helaas draait zowel de generator als de database op dezelfde server, hier gaan dus ook al cycles aan verloren.Wat doe je nog meer?
Zal hier naar kijken.Is het puur de query tijd die je nu noemt? (gooi er eens een explain tegenaan)
Als sommige code buiten de query sneller kan, dan is dat prima.Moet alles in de query gebeuren?
Niet zo zeer één vak. Mensen die een "gemiddelde" kennis hebben van Java, PHP en Mysql worden "hierin gegooid".En net zo belangrijk: Wat is de achterliggende opdracht/informatie die je hebt gekregen? Over welk vak hebben we het? Wat hoor jij te weten?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
[ Voor 0% gewijzigd door 4VAlien op 16-11-2011 12:34 . Reden: records van 64 ipv 80bit met veel files :-) ]
Getallen opslaan als string is hier heel onverstandig.4VAlien schreef op woensdag 16 november 2011 @ 12:32:
Moet je wel een No-SQL database gebruiken zoals Mongo? Met de eerder geposte aannames dat een record uit 16 + 32 + 32 bits bestaat zou ik gewoon 8.000 (1 per station) flatfiles op een ext4/ntfs of vergelijkbaar filesystem zetten en dan daar doorheen racen met een simpel programmatje (gewoon van eind van de file teruglezen tot max 6uur). Zolang het in RAM past kun je het zelfs multithreaded doen en anders is je disk de bottleneck dus dan is 1 of 2 threads slimmer.
Nee, je hebt een paar blokjes data nodig uit de gesorteerde index en hiermee kun je dan een indexscan doen op de daadwerkelijke data. Dus ook daar zijn maar een paar blokjes data nodig uit de tabel. Dit wordt door de DBMS geregeld, hoef jij niet voor te zorgen. Jij moet er alleen voor zorgen dat de DBMS de mogelijkheid krijgt om dit te doen, jij moet dus de juiste indexen aanmaken i.c.m. een passende query.GlowMouse schreef op woensdag 16 november 2011 @ 12:21:
[...]
Met die index heb je alle data van de afgelopen 6 uur nodig om de query te verwerken.
Ik doe niet anders, al gaat het hier altijd om data van de afgelopen 2 uur. De totale omvang zal vergelijkbaar zijn, enige miljarden records.
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Jouw index is de data. En de index is niet zo goed gesorteerd dat je maar een paar blokjes nodig hebt; datetime als eerste kolom neemt heel veel verschillende waarden aan waardoor de waarde als BTREE afneemt. Als PK is de combinatie (tijd,station) handig omdat het uniek is en inserts dan mooi achteraan je tabel gaan, maar de uitbreiding met windsnelheid levert niks op.cariolive23 schreef op woensdag 16 november 2011 @ 12:34:
[...]
Nee, je hebt een paar blokjes data nodig uit de gesorteerde index en hiermee kun je dan een indexscan doen op de daadwerkelijke data. Dus ook daar zijn maar een paar blokjes data nodig uit de tabel. Dit wordt door de DBMS geregeld, hoef jij niet voor te zorgen. Jij moet er alleen voor zorgen dat de DBMS de mogelijkheid krijgt om dit te doen, jij moet dus de juiste indexen aanmaken i.c.m. een passende query.
[ Voor 42% gewijzigd door -DarkShadow- op 16-11-2011 12:42 ]
Specialist in:
Soldeerstations
Oscilloscoop
Hebben we nu. Data is aan het pompen. Dus ben benieuwd.-DarkShadow- schreef op woensdag 16 november 2011 @ 12:41:
Waarom geen index op de windsnelheid?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Ik heb 'string' uberhaupt niet genoemd. Ik zit puur te denken aan binary flatfiles per station. Data schrijven zou nog steeds prima met Java kunnen en voor de ultieme snelheid zou je het zoeken met een klein C programma'tje kunnen doen.GlowMouse schreef op woensdag 16 november 2011 @ 12:34:
[...]
Getallen opslaan als string is hier heel onverstandig.
Bedacht ik me ook ja, maar dan nog zit je met je filesystem (filename, ctime, mtime, atime, permissies, blocksize) die voor enorm veel overhead zorgt. Je kunt alles ook gewoon in je java-app in het geheugen houden. Met 4 GB past dat makkelijk.4VAlien schreef op woensdag 16 november 2011 @ 12:42:
[...]
Ik heb 'string' uberhaupt niet genoemd. Ik zit puur te denken aan binary flatfiles per station. Data schrijven zou nog steeds prima met Java kunnen en voor de ultieme snelheid zou je het zoeken met een klein C programma'tje kunnen doen.
[ Voor 5% gewijzigd door GlowMouse op 16-11-2011 12:47 ]
Verwijderd
[ Voor 6% gewijzigd door Verwijderd op 16-11-2011 13:58 ]
Een int wordt meestal opgeslagen met 4 bytes. Door er een short van te maken heb je al weer 2 bytes winst.ZpAz schreef op woensdag 16 november 2011 @ 12:35:
De windspeed wordt inderdaad als double opgeslagen. Stationsnummer is een int. Datum een timestamp.
Je zou er voor kunnen kiezen om niet de tijd op te slaan: feitelijk heb je 21600 verschillende tijden, ze zijn opeenvolgend, met een seconde verschil. Je moet dan alleen nog de tijd op te slaan waaraan ze relatief zijn.
21600 past ook weer in 2 bytes.
Je kunt kiezen voor een circulaire buffer (zie Wikipedia: Circular buffer). Het opslaan van een nieuwe waarde is dan gelijk aan het 'verwijderen' van een oude waarde.
Wind fluctueert zoveel dat het ook in 1 byte past met eenheid m/s.Foeijonghaai schreef op woensdag 16 november 2011 @ 12:48:
[...]
Een int wordt meestal opgeslagen met 4 bytes. Door er een short van te maken heb je al weer 2 bytes winst.
Goed punt, de datetime moet een aparte index zijn. Puur om er voor te zorgen dat je slechts X uur aan data opvraagt. EXPLAIN zou dit ook laten zien.GlowMouse schreef op woensdag 16 november 2011 @ 12:38:
[...]
Jouw index is de data. En de index is niet zo goed gesorteerd dat je maar een paar blokjes nodig hebt; datetime als eerste kolom neemt heel veel verschillende waarden aan waardoor de waarde als BTREE afneemt. Als PK is de combinatie (tijd,station) handig omdat het uniek is en inserts dan mooi achteraan je tabel gaan, maar de uitbreiding met windsnelheid levert niks op.
De sortering op station en snelheid (BTREE index) is er om er voor te zorgen dat je per station slechts 1 maximale snelheid hoeft op te vragen, dat zijn dus maximaal 8000 blokken met 8000 stations. Het is dan afhankelijk van de IO hoe snel je dit van disk kan opvragen.
Een DBMS kan prima met 2 indexen gelijktijdig werken, dat mag geen probleem zijn.
Verwijderd
je zou er voor kunnen kiezen om GEEN index te leggen op de tabel.
dan gaat inserten alvast maximaal snel.
Net voor het opvragen van de MAX windsnelheid leg je gauw een tijdelijke index op windsnelheid
die je daarna dus weer verwijderd.
Merk op: veel hangt dan natuurlijk af van de frequentie waarmee je de max windsnelheid moet raadplegen.
Op zich is dat dan gefixed in een paar seconden. (zeker <25 sec)
Het invoegen van de data in de database is het probleem niet. De server zou ongeveer 3x meer data in kunnen voegen zonder te flippen. Het berekenen van de snelste snelheid is het probleem.Verwijderd schreef op woensdag 16 november 2011 @ 12:56:
8000 inserts per seconde is vrij veel.
je zou er voor kunnen kiezen om GEEN index te leggen op de tabel.
dan gaat inserten alvast maximaal snel.
Net voor het opvragen van de MAX windsnelheid leg je gauw een tijdelijke index op windsnelheid
die je daarna dus weer verwijderd.
Merk op: veel hangt dan natuurlijk af van de frequentie waarmee je de max windsnelheid moet raadplegen.
Op zich is dat dan gefixed in een paar seconden. (zeker <25 sec)
[ Voor 3% gewijzigd door ZpAz op 16-11-2011 13:00 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Mijn tip: gebruik een custom binary formaat voor het opslaan, en kijk naar Java NIO. Dan zou het niet zo'n probleem moeten zijn.
Verwijderd
Wanneer het tijdstip van MAX dan langer is geleden dan 6uur dan ga je uit al de opgeslagen "mindere" values de nieuwe MAX bepalen. Dit zou je alvast veel data kunnen besparen. Tenzij de windsnelheid gedurende 6 uren gestaag afneemt natuurlijk ...
Inserten is niet het probleem.Verwijderd schreef op woensdag 16 november 2011 @ 12:56:
8000 inserts per seconde is vrij veel.
je zou er voor kunnen kiezen om GEEN index te leggen op de tabel.
dan gaat inserten alvast maximaal snel.
Net voor het opvragen van de MAX windsnelheid leg je gauw een tijdelijke index op windsnelheid
die je daarna dus weer verwijderd.
Merk op: veel hangt dan natuurlijk af van de frequentie waarmee je de max windsnelheid moet raadplegen.
Op zich is dat dan gefixed in een paar seconden. (zeker <25 sec)
Daarnaast is inserten razensnel in MongoDB, iig een stuk sneller dan gigabytes aan informatie te indexeren.
[ Voor 91% gewijzigd door -DarkShadow- op 16-11-2011 13:03 ]
Specialist in:
Soldeerstations
Oscilloscoop
Helemaal correct. Veel tijd om het aan te passen hebben we helaas niet meer. Dus afstappen van Mongo is eigenlijk geen optie meer.HMS schreef op woensdag 16 november 2011 @ 13:00:
Klinkt als een opdracht van de Hanzehogeschool.
Mijn tip: gebruik een custom binary formaat voor het opslaan, en kijk naar Java NIO. Dan zou het niet zo'n probleem moeten zijn.
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Dat gaat helemaal niet werken vrees ik....Verwijderd schreef op woensdag 16 november 2011 @ 12:47:
Windsnelheden veranderen niet snel. Voeg een veld 'piek' toe en zet die op 'true' als de volgende meting lager is dan de huidige. Hoef je nog maar een fractie van je data te doorzoeken.
Stel dat je volgende fictieve metingen binnen krijgt: 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11
In dat geval zijn de eerste negen waardes allemaal piek waarden maar de hoogste waarde uit de reeks zit er niet tussen....
Verwijderd
172 miljoen records is geen enkel probleem als je je index op snelheid hebt liggen.
ik ken jullie DB-systeempje niet, maar met SQLite heb ik dat hier zo gepiept.
Dat is 6GB aan data blijkbaar, op de HDD. (er wordt nog wat meer opgeslagen naast windspeed enzo.)
[ Voor 18% gewijzigd door ZpAz op 16-11-2011 13:06 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Klinkt alsof je hier niet naar toe bent geweest en dat er niet overlegd wordt met andere projectgroepen.
Het is namelijk de bedoeling dat je de data niet in een reguliere database opslaat.... maar dat je zelf een oplossing maakt. Je moet je data binair opslaan. Aangezien alle data die je binnen krijgt dezelfde structuur heeft kan je de data die je op wilt slaan even groot maken (1byte voor wind, 2byte voor temp, etc).
Ooit gehoord van een Random Access File? Google hier maar eens op en ga dan je programma aanpassen.
Ik weet niet of je nog een meeting hebt met je 'buitenlandse klanten', als je dat wel hebt; duidelijkere eisen vragen! Afgelopen 6 uur is leuk, maar met welke interval?! Realtime? Nutteloos, inefficiënt en belastend voor de hardware. Misschien hoeft het pas om het uur zichtbaar te zijn of om het half uur?
Dan kan je namelijk per uur/halfuur opslaan wat de snelste windsnelheid was en dat moet het toch al een heeeeeel stuk makkelijk maken!
Vooral erg belangrijk overigens: zorg dat je website goed in elkaar steekt! URL's die niet werken moet je afvangen. Het moet inprincipe niet mogelijk zijn om een error tegen te komen op de site.
Als je nog vragen hebt, vraag Bredek en overleg met andere projectgroepen. Dit is een redelijk pittige opdracht, maar zeker wel te doen
www.ping-win.nl
Bredek had aan een ander groepje geadviseerd om het in losse tekst bestanden op te slaan.. goed, tot zo ver zijn bijdrage. Of dit heb ik verkeerd verstaan van het groepje.Rye schreef op woensdag 16 november 2011 @ 13:06:
Ik neem aan dat Bredek nog steeds docent is in dit thema? Toen ik dit thema vorig jaar deed hadden we ook projectbegeleiding elke week. Gewoon even een half uurtje waarin je vragen kon stellen en je ook vragen moest stellen als je aanwezig was.
De meeste projectgroepen gebruiken trouwens MongoDB.Klinkt alsof je hier niet naar toe bent geweest en dat er niet overlegd wordt met andere projectgroepen.
Onze opdracht was realtime van de afgelopen 6 uur. Dus klik en uitvoeren. Als het om het uur oid was was het inderdaad al makkelijker geweest. Daarom kregen we ook de 25 seconden window, omdat het "wel even" kon duren.Ik weet niet of je nog een meeting hebt met je 'buitenlandse klanten', als je dat wel hebt; duidelijkere eisen vragen! Afgelopen 6 uur is leuk, maar met welke interval?! Realtime? Nutteloos, inefficiënt en belastend voor de hardware. Misschien hoeft het pas om het uur zichtbaar te zijn of om het half uur?
Dan kan je namelijk per uur/halfuur opslaan wat de snelste windsnelheid was en dat moet het toch al een heeeeeel stuk makkelijk maken!
[ Voor 51% gewijzigd door ZpAz op 16-11-2011 13:10 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Ik dacht aan het volgende:
Je moet de inkomende data direct sorteren voordat het opgeslagen wordt van hoog naar laag. Daarna laat je iedere seconde de metingen van 6 uur en 1 seconden verwijderen. Dan hou je een aflopende tabel over met de hoogste waarde bovenaan.
Verwijderd
dit is immers wat een goed database systeem voor jou al efficient zou moeten regelen.
Je kan altijd het warm water heruitvinden, maar het zal je in dit geval alleen maar meer tijd en bugs opleveren.
Een mogelijkheid kun je een sliding window maximum bijhouden (bijvoorbeeld op deze manier) waarbij je de data nog steeds in Mongo opslaat (maar dus niet Mongo's indices gebruikt om te queryen).
Een alternatief is om de data niet in een Mongo database te stoppen, maar een tool als rrdtool te gebruiken. Die is specifiek bedoeld voor dit soort statistieken.
[ Voor 4% gewijzigd door Soultaker op 16-11-2011 13:18 ]
Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?
In mijn TS zal dat wel niet duidelijk zijn geweest. Maar dit werkt niet. Omdat het een moving timeframe is. Daarnaast geeft elk station 1 insert per seconde (welke er 8000 zijn). Dus er maar één van over houden werkt nietBarleone schreef op woensdag 16 november 2011 @ 13:20:
Goed, misschien ben ik gek, maar wat betreft die 8000 inserts per seconde, kun je die niet gewoon verkleinen tot 1 insert (de hoogste waarde van die 8000).
[ Voor 13% gewijzigd door ZpAz op 16-11-2011 13:22 ]
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Wil je dan van elk willekeurig station de hoogste windsnelheid kunnen achterhalen?ZpAz schreef op woensdag 16 november 2011 @ 13:21:
[...]
In mijn TS zal dat wel niet duidelijk zijn geweest. Maar dit werkt niet. Omdat het een moving timeframe is. Daarnaast geeft elk station 1 insert per seconde (welke er 8000 zijn). Dus er maar één van over houden werkt niet
Of is de vraag: Wat is de hoogste windsnelheid gemeten in (Neder)land van de afgelopen 6 uur?
Dan lijkt het mij volkomen logisch om 7999 resultaten / seconde weg te gooien die toch nooit in aanmerking komen.
Anders gezegd, dit komt neer op een UNIQUE timestamp dingetje.
[ Voor 4% gewijzigd door Barleone op 16-11-2011 13:29 ]
Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?
Klopt, maar omdat het een moving timeframe is werkt dit niet. (Je kan wel alles ouder dan 6 uur weggooien, maar dan heb je al een berg aan data.)Barleone schreef op woensdag 16 november 2011 @ 13:27:
[...]
Wil je dan van elk willekeurig station de hoogste windsnelheid kunnen achterhalen?
Of is de vraag: Wat is de hoogste windsnelheid gemeten in (Neder)land van de afgelopen 6 uur?
Dan lijkt het mij volkomen logisch om 7999 resultaten / seconde weg te gooien die toch nooit in aanmerking komen.
Anders gezegd, dit komt neer op een UNIQUE timestamp dingetje.
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Lees mijn posts nog maar een keer, je mist mijn punt volkomen.ZpAz schreef op woensdag 16 november 2011 @ 13:32:
[...]
Klopt, maar omdat het een moving timeframe is werkt dit niet. (Je kan wel alles ouder dan 6 uur weggooien, maar dan heb je al een berg aan data.)
@hieronder @TS
Per station. Ja, dan moet je het inderdaad zoeken in de technische oplossingen.
[ Voor 32% gewijzigd door Barleone op 16-11-2011 13:43 ]
Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?
Lees de eerste post dan nog maar eens, hij wil de snelste tijd per station. Dan moeten er dus 8000 resultaten per seconde opgeslagen worden. Niet 1.Barleone schreef op woensdag 16 november 2011 @ 13:36:
[...]
Lees mijn posts nog maar een keer, je mist mijn punt volkomen.
Filter de data bij binnenkomst!
8000 waarden per seconde, daarvan kan er toch echt maar 1 de snelste zijn.
En het timeframe van 8000 resultaten is 1 seconde, dus niks geen timeframe problemen
timestamp 0000001 > 17km/h de snelste, 7999 resultaten weggooien.
timestamp 0000002 > 17,1km/h de snelste, 7999 resultaten weggooien.
Als het realtime is, waarom cluster je het dan niet? Dus niet elke keer 6 uur aan data afzoeken, maar deel het op in blokken van zeg 5 minuten. Je slaat dan per blok de hoogste waarde op.
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Ik denk dat mijn reactie niet duidelijk was. Het is per station. En elke seconde krijg ik voor elk station een nieuwe meting binnen (welke er 8000 zijn). Je moet dan voor elk station kijken dus of er voorgaand een sneller was. If so, dan negeren, anders overschrijven.Barleone schreef op woensdag 16 november 2011 @ 13:36:
[...]
Lees mijn posts nog maar een keer, je mist mijn punt volkomen.
Filter de data bij binnenkomst!
8000 waarden per seconde, daarvan kan er toch echt maar 1 de snelste zijn.
En het timeframe van 8000 resultaten is 1 seconde, dus niks geen timeframe problemen
timestamp 0000001 > 17km/h de snelste, 7999 resultaten weggooien.
timestamp 0000002 > 17,1km/h de snelste, 7999 resultaten weggooien.
Wat werkt, totdat je 6 uur terug in de tijd wilt gaan. Want dan je snelste meting "verlopen" en kan alsnog je één na snelste meting (van 4 uur geleden) sneller zijn dan de metingen die je nu binnnen krijgt. Maar die heb je dan al weggegooid.
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Als je dit als extra data in je tabel opslaat kun je ook de hoeveelheid data die je moet bekijken verminderen. Als je b.v. per minuut het max van die minuut apart opslaat hoef je nadat je huidige max 6 uur oud is alleen die waardes per minuut te controleren op de hoogste waarde en daarna in de waardes die bij die minuut zitten kijken wat de precieze tijd is (opsplitsing kun je nog verder optimaliseren als je wilt.Hercul3s schreef op woensdag 16 november 2011 @ 12:15:
Per minuut de hoogste windsnelheid eruit filteren, scheelt je een factor x60 aan data, mss dat het dan snel genoeg is?
Edit: Dit eventueel doorvoeren (per 2 minuten, per 4 minuten etc) totdat je binnen 25 secs de data kan berekenen.
Je verliest hier natuurlijk wel aan accuratesse, maar aan de andere kant blijf je binnen een zeer klein timeframe (1 tot 4 minuten).
[removed]
Met welke resolutie moet de nauwkeurigheid zijn en wat voor vertraging zit er in de data die je binnenkrijgt ( Kan het zijn dat je data met een uur vertraging binnen krijgt ).
Je zou natuurlijk gewoon in geheugen de maximale waardes voor elke seconde bij kunnen houden. Je hoeft dan bij elke sample alleen maar te kijken of het de hoogste windsnelheid van die seconde is. Voor een window van 6 uur hoef je dan maar 60*60*6 = 21600 waardes bij te houden, en dat is makkelijk in je werkgeheugen te doen. Als je de resolutie nog lager legt ( Bijvoorbeeld per minuut ) is het helemaal makkelijk te overzien, ook voor langere periodes.
edit:
Ah ik zie dat je het per weerstation wil weten, dan nog zou je de resolutie kunnen verkleinen om zo de hoeveelheid data enorm te verkleinen.
[ Voor 8% gewijzigd door Woy op 16-11-2011 13:52 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ik heb daar overheen gelezen in je TS, my bad.ZpAz schreef op woensdag 16 november 2011 @ 13:40:
[...]
Ik denk dat mijn reactie niet duidelijk was. Het is per station...
@Woy hierboven: dat per seconde is onmogelijk, omdat voor elk van de 8000 stations de waardes toonbaar moeten blijven. Ik ging daar zonet de fout mee in, vandaar mijn excuus ^^
Een kleine optimalisatie zou je kunnen halen uit een oplopende windsnelheid. Alle OUDERE waarden kun je dan per definitie weggooien. Bij afnemende wind, loopt je database echter weer vol tot de maximale 6 uur.
[ Voor 25% gewijzigd door Barleone op 16-11-2011 14:25 ]
Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?
Verwijderd
Oops, te weinig koffie. Idee is goed maar je moet inderdaad iets meer doen om de pieken er uit te vissen.Waking_The_Dead schreef op woensdag 16 november 2011 @ 13:03:
[...]Stel dat je volgende fictieve metingen binnen krijgt: 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11
In dat geval zijn de eerste negen waardes allemaal piek waarden maar de hoogste waarde uit de reeks zit er niet tussen....
Enige probleem dat je dan nog hebt, wat Rubizon ook opmerkt, is wanneer alle waarden binnen de timeslice lager zijn dan die op het begin en einde van de slice. Om dat op te lossen heb je alle waarden alsnog nodig. Maar je neemt dan gewoon de max van de hoogste piek / snelheid op begin slice / snelheid eind slice.
Oplossingen heb ik hier al voorbij zien komen:
-Tabel met grotere granulateit, b.v. 1 uur, of 5 minuten met de max waarden.
-Tabel met alle max waarden en tijdstippen. Die buffer je en sla je pas op als er een nieuwe max waarde in gaat, of een oude maxwaarde uit de sliding window schuift. (complex... en zinloos, want 6 uur is ook maar zomaar gekozen, 6 uur +/- 5 minuten maakt niet uit, als de huidinge utischieters maar meegenomen worden)
Ik zit me echt af te vragen of een index zal helpen. De index zou op waarde en tijd moeten lopen, per station, wat toevallig ook denk ik alle velden in de tabel zijn. Een full index scan is trager dan een full table scan... dus een index scan zou je niks besparen.
Wellicht dat partioneren van de data (sharding in mongodb als ik effe 20 seconden zoek) helpt in het snel kunnen terughalen.
Maar als je data zodanig is opgeslagen dat je die niet snel genoeg kunt ophalen dan is hij niet goed geimplementeerd. Kijk vooral naar de beschikbare hardware, dat die optimaal gebruikt wordt. Dan moet je echt PRECIES kijken hoe het is geimplementeeerd, of hoe je het kunt implementeren. Bij grote datasets is dat weer ouderwets belangrijk.
Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.
Verwijderd
Het verwijderen of toevoegen van maxima heeft niets te maken met andere maxima*). Je houdt alle lokale maxima bij. Vervolgens kijk je binnen de set lokale maxima in een bepaalde tijd, hier zes uur, wat het absolute maximum is. Vergelijk die met de snelheden op het begin en einde van die zes uur; is één van die twee hoger dan is dat uiteraard het absolute maximum.leuk_he schreef op woensdag 16 november 2011 @ 13:58:-Tabel met alle max waarden en tijdstippen. Die buffer je en sla je pas op als er een nieuwe max waarde in gaat, of een oude maxwaarde uit de sliding window schuift. (complex... en zinloos, want 6 uur is ook maar zomaar gekozen, 6 uur +/- 5 minuten maakt niet uit, als de huidinge utischieters maar meegenomen worden
*) je zou oudere lokale maxima die lager zijn dan een nieuwe lokaal maximum kunnen verwijderen wanneer je alleen het maximum over de afgelopen zes uur (dus altijd nu - zes uur) wilt hebben. Maar dat lijkt me inderdaad veel te complex voor de winst die je ermee haalt.
[ Voor 16% gewijzigd door Verwijderd op 16-11-2011 14:13 ]
Verwijderd
Je kan toch bij een insert van een nieuwe waarde alle waarden uit het verleden die lager zijn verwijderen, per meetstation uiteraard? Dit is anders dan alleen de hoogste waarde bewaren! (Het sliding window mechanisme werkt namelijk nog gewoon).
Als we bijvoorbeeld de volgende reeks met waarden hebben zijn we geinsteresseerd in de dikgedrukte waarden.
9, 10, 8, 7, 6, 5, 9, 8, 5, 2, 4, 5
Alle niet dikgedrukte waarden mogen verwijderd worden gezien deze niet interessant zijn.
Wanneer de wind gedurende 6 uur lang consistent blijft dalen heb je nog dezelfde situatie als nu, gezien dit practisch nooit zal voorkomen zal dit het aantal records dat je hebt in de database enorm verminderen.
Verwijderd
in de praktijk is het best denkbaar dat wind over een periode van pakweg 6u gestaag afneemt.Wanneer de wind gedurende 6 uur lang consistent blijft dalen heb je nog dezelfde situatie als nu, gezien dit practisch nooit zal voorkomen zal dit het aantal records dat je hebt in de database enorm verminderen.
Verwijderd
Wanneer je het als trend bekijkt wel, maar wanneer je 1x per seconde een meting binnen krijgt zullen hier pieken en dalen in zitten en zal er nog steeds behoorlijke data vermindering zijn.in de praktijk is het best denkbaar dat wind over een periode van pakweg 6u gestaag afneemt.
Dat kost veel meer rekenwerk denk ik, want je moet bij elke insect checken of de nieuwe waarde hoger is. Daarnaast moet je elke keer dat een waarde verloopt alle waarden in het sliding window doorzoeken naar een nieuwe hoogste.Jegorex schreef op woensdag 16 november 2011 @ 16:07:
Zet in de database een flag bij de hoogste snelheid van elk station. Op het moment dat de flag bij een tijd staat die meer dan 6 uur oud is ga je op zoek naar een nieuwe hoogste windsnelheid voor dat station.
1. wil je realtime weten wat de hoogste windsnelheid van één meetstation is?
2. wil je realtime weten wat de hoogste windsnelheid overal is?
1 is niet moeilijk. Dat zijn heel weinig waarden, dat kun je gemakkelijk processen (zelfs vanaf disk)
2 vereist meer optimalisatie en is waar de rest van dit topic naartoe lijkt te wekren.
Meer dan drie uur data, nog steeds +- een sec.Aloys schreef op woensdag 16 november 2011 @ 15:38:
Wat is nu inmiddels de snelheid van die query nu je de pi op windsnelheid hebt staan? Ik kan alleen nog maar terugvinden dat dat 1 sec was bij een half uur ofzo?
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Kan iemand mij uitleggen wat het nut is om windsnelheid vast te leggen met een nauwkeurigheid van 0,01 mm/s en met welke apparatuur je dat kan meten?32 bits float
Iets met huiswerkopdracht en afstand tot de realiteit...
[ Voor 6% gewijzigd door Henk007 op 16-11-2011 17:31 ]
Ik heb nergens aangegeven dat het met een bepaalde nauwkeurigheid is, maar het is met één achter de komma. Bijvoorbeeld: 40,1Henk007 schreef op woensdag 16 november 2011 @ 17:28:
Kan iemand mij uitleggen wat het nut is om windsnelheid vast te leggen met een nauwkeurigheid van 0,01 mm/s en met welke apparatuur je dat kan meten?
Iets met huiswerkopdracht en afstand tot de realiteit...
Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF
Kun je windsnelheden tot 409,6 km/h vastleggen
Gerekend in m/s is 9 bit per meting voldoende.
[ Voor 56% gewijzigd door Henk007 op 16-11-2011 17:38 ]
Ja, want elke taal heeft support voor 9 of 12 bits integersHenk007 schreef op woensdag 16 november 2011 @ 17:33:
Dus 12 bits heb je genoeg aan, scheelt alweer bijna een factor 3 in data
Kun je windsnelheden tot 409,6 km/h vastleggen
Gerekend in m/s is 9 bit per meting voldoende.
plan 2: Je noteert steeds alleen de snelste van de 8000 die je per seconde binnen krijgt. Dus je neemt van die 8000 steeds alleen de snelste(n) en die zet je in de database.
Nieuw idee: Van 172,8 miljoen resultaten naar +/-14,5 miljoen.
- Je vat elk half uur samen in 8000 hoogste resultaten. Dat kun je maar van 5,5 uren doen.
Dus 11 x 8000 = 88.000 resultaten. - Het recentste halfuur is nog niet compleet, dus neem je gewoon alle resultaten.
Dus 8000 x 1799sec = 14392000 resultaten - Het laatste halfuur wordt steeds korter uiteraard, dus neem je de resultaten die je nog nodig hebt.
Dus 8000 x 1sec = 8000 resultaten
Uiteraard behoud je alle resultaten, alleen van die middelste 5,5 uur van het timeframe neem je de hoogste 88.000 scores die je even 'op-een-blaadje' of weet ik veel waar noteert.
[ Voor 31% gewijzigd door Barleone op 16-11-2011 19:23 ]
Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?
o.a. :
Sliding Window Maximum
Maximum in sliding window
Sliding Window Maximum
Efficiënter gaat het niet ( O(n) ). Als je hardware dit niet redt is het jammer maar helaas.
[ Voor 40% gewijzigd door Henk007 op 16-11-2011 20:59 ]
1) op basis van luchtsnelheid (bovenste is de snelste);
2) op basis van tijd, als er eentje verlopen is zit ie onderin.
Bij het toevoegen van een waarde:
1) Verwijder je alle OUDERE metingen met een LAGERE windsnelheid
2) Dit doe je door queue2 te pollen (laatste waarde verwijderen) tot je bij "jezelf" ben aangekomen
3) All waardes die je in queue2 bent afgelopen, verwijder je uit queue1
4) Peek queue1 (bovenste waarde ALLEEN kijken)
5) Als dit langer als 6 uur geleden is, verwijder hem uit queue1 en queue2 en ga naar stap 4
6) De gepeekte waarde is de snelste windsnelheid.
Met deze methode:
1) Is je geheugen praktisch leeg bij een record snelheid;
2) Worden alle nutteloze waardes direct verwijderd;
3) Hoef je niet te zoeken naar je getallen, ze zitten altijd in de top of de bottom van een queue;
4) Heb je wel een probleem met lookups in de andere queue, je kunt ook het object invalidaten en negeren als je hem tegen komt (kost meer geheugen, maar is sneller) of je moet priority queue en hashmap combineren;
5) Hoef je nooit naar disk te schrijven/lezen.
{signature}
Je hebt gelijk, in principe is er maar 1 queue nodig. Die doorloop je elke stap helemaal en je onthoud de hoogste waarde.
PriorityQueue heb je dan niet meer nodig, LinkedList voldoet al, scheelt weer sorting.
Wikipedia: Double-ended queue
Achja je kan niet alles de eerste keer voutloos doen
ik kan je de code wel geven, maar dan snijd ik mezelf in de vingers
Ow, enne succes met de oplevering! Welk land hebben jullie?
Professioneel Heftruck Syndroom