webForumDet fria alternativet

Struktur på program som behandlar mycket data

6 svar · 657 visningar · startad av intesa

intesaMedlem sedan apr. 2006190 inlägg
#1

Behöver lite tips på strukturen för ett program som gör lite jobb på ett par Hashmaps.

Ser ut ungefär såhär:

jobKlass {
 Hashmap map;
 jobbKlass(Hashmap map);
 doJobOne(); // Arbetar med datan...
 doJobTwo(); // Arbetar vidare med datan...
 doJobThree(); // Arbetar ännu mer med datan...
 osv...
}

Man skickar alltså en Hashmap till ett jobKlass-objekt och kallar sedan på doJobX en efter en (kan vara lite olika kombinationer på ordningen) tills formateringen är klar.

Något såhär skulle jag vilja ha det:

filterOne {
 doJob(Hashmap map); //Arbetar med datan...
}
filterTwo {
 doJob(Hashmap map); // Arbetar vidare med datan...
}
filterThree {
 doJob(Hashmap map); // Arbetar ännu mer med datan...
}

Sen skulle man på något sätt länka ihopp filterna så att man kan skicka in Hashmapen i filterOne så skickas den (efter att filterOne jobbat lite med Hashmapen) vidare till filterTwo osv.
Dock känns inte denna lösning helt optimal heller, för jag räknar med att jobba med STORA Hashmaps så att hålla på att kopiera all data vidare till nästa filter-objekt känns onödigt minneskrävande.

Hur lägger ni upp strukturen på era program som ska behandla mycket data? Känner mig helt lost...

spangoMedlem sedan juni 20006 147 inlägg
#2

Om du modifierar hashmappen i filtermetoderna kommer den inte kopieras när du skickar den till nästa filter, du slänger ju bara iväg pekaren till det objekt du jobbat på. Exakt vad är det dina filter och dina jobb ska göra?

intesaMedlem sedan apr. 2006190 inlägg
#3

Hej spango, tack för ditt svar.

Det jag ska göra är att behandla olika mätvärden som är sparade i Strings. Det kan t.ex. vara att räkna hur många mätvärden av en viss typ som finns, räkna ut medelvärden och sortera bort irrelevant data. I vissa fall behövs inte alla filter köras så jag vill ha systemet ganska flexibelt så att jag kan lägga till och ta bort filter för varje körning.
Känns som att det bör finnas något bra "standardsätt" för att göra sånna här jobb.

Gjorde ett litet test med att skicka en sträng genom olika filter som ändrade lite i varje steg, fick för mig att strängen kopierades mellan filterna... Men mitt testprogram kanske var skrivet lite konstigt eller så drog jag fel slutsats.
Får ta och skriva ett nytt lite mer genomtänkt test idag.

TheUnrealMedlem sedan okt. 200427 inlägg
#4

Hallå, nu var det ju ett tag sen jag var påläst om Java så risken finns att kunskapen blivit lite korrupt med tiden. Och nya versioner har ju kommit oxå :)

Jag tycker det ser ut så här:
Datat ligger i klassen ( privat kanske? ) och du säger att det är stora mängder data, då tycker ju jag att du ska se till att jobba med pekare till datat och inte hålla på och kopiera och sen kopiera tillbaka. Eller finns det någon anledning att spara rådata?
Hur som haver så minskar minnesförbrukningen och belastningen på garbage collectorn. Fast jag har ju då jobbat med en VC++ programmerare som hade ledordet "minne är billigt", men jag anser att paging tar tid :)

Vad gäller strukturen så är du nära lösningen i mina ögon.
Själva arbetet urför du i doJob... funktionerna, dessa behöver inget argument då det kan komma åt medlemmsdatat i klassen direkt då de är medlemmar av samma klass.

I filter... funktionerna anropar du bara doJob... funktionerna i avsedd och lämplig ordning:

filterOne {
 doJobOne(); //Arbetar med datan...
}
filterTwo {
 doJobOne(); //Arbetar med datan...
 doJobTwo(); // Arbetar vidare med datan...
}
filterThree {
 doJobOne(); //Arbetar med datan...
 doJobThree(); // Arbetar ännu mer med datan...
 .... 
 .... // ja diverse doJobb...() anrop osv...

}

Hoppas jag lyckas tala ur skägget, borde ju vara lätt när man är nyrakad ;)

/Mattias

PS. Alla funktioner är ju medlemmar av klassen då.

spangoMedlem sedan juni 20006 147 inlägg
#5

intesa skrev:

Det jag ska göra är att behandla olika mätvärden som är sparade i Strings. Det kan t.ex. vara att räkna hur många mätvärden av en viss typ som finns, räkna ut medelvärden och sortera bort irrelevant data.

Låter som att det är numeriska data? Då är det en het idé att översätta dem till någon mer passande numerisk datatyp, long eller double eller BigDecimal eller något annat. Det går rasande mycket fortareatt arbeta mot, det är enklare att använda och kräver mycket mindre minne.

intesa skrev:

Gjorde ett litet test med att skicka en sträng genom olika filter som ändrade lite i varje steg, fick för mig att strängen kopierades mellan filterna...

Ändrade filtret på själva strängen? I sådana fall så kopieras allt, ja, strängar är read-only så varje gång du gör något med en sträng kopieras den (något förenklat). Men som sagt vill du helst låta bli att använda strängar om det är numeriska värden du jobbar med.

LimeMedlem sedan sep. 2001837 inlägg
#6

Ett annat angreppssätt är att ta allt data, transformera det till XML eller en EMF-modell och sedan köra någon form av tranformering på det.

intesaMedlem sedan apr. 2006190 inlägg
#7

spango skrev:

Låter som att det är numeriska data?

Jo det är numerisk data som det ska räknas med. Grejen är att programmet får in all data som strängar, sen får jag hämta ut all rellevant data där ifrån.
Det jag plockar ut från strängen är en liten "substring" som beskriver vilken typ av märvärde och sedan ett numeriskt mätvärde.

Tänkte från början att det då skulle räcka att behandla datan i Hashtables, med string-beskrivningen som "key" och en det numeriska talet som "value", men nu visar det sig att jag måste spara lite delberäkningar och sånt också... Så den strukturen sprack :)
Måste testa att göra en egen klass för datan och sedan spara alla mätvärden i en sådan array. Ska se till så jag bara arbetar med ints och doubles också.

Lime, har inte hört talas om EMF-modellen tidigare, men jag ska ta en titt på det med.

Tack alla för svaren!

Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb