ram overaskende overskredet

Tags:    visual-basic class array

jeg har lavet en classe med ca 7 objekter hvoraf halvdelen er arrays det største array hedder ca.:(50,36,110) så er der ca tre mere på ca (50,36) jeg undre mig over at jeg løber ud af ram efter at have oprettede classen lidt over 2600gange ps. har 24gb ram og ca 48gb ledig på c drev.



7 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Det er godt nok mange strings du har brug for :).

Fylder en public string meget ´mere end en dim string

Ikke helt sikker med hvad du mener. Men 'public/private/protected/internal' betegner synligheden, altså hvilke andre dele der kan se dine variabler. Dette har ingen betydning hvor meget hukommelse der bruges. Nøgleordet 'dim' bruges til at allokere data, og det er her hukommelsen begynder at blive tappet. Hvor meget afhænger af datatypen:

Lidt mere præcise beregninger, hvis du kører 64 bit .NET

En 'string' typisk bruge mindst 16 bytes, men mere proportionel med længden.
En 'int'eger vil typisk kun bruge 4 bytes.

De arrays du laver indeholder ikke strengene selv, men blot reference til strengene. De fylder 8 bytes. Når du så begynder at fylde array'en med strenge: myArray[4,3,4] = "My Super String", erstatter du 'null'-elementet med en reference til din nye streng. Referencen havde du lavet plads til, men et andet sted i .NET er der også en reference til dine streng. Strengene selv fylder også, så for hvert element ender du med at betale: 8 bytes i array, 8 bytes i .NET, 16 bytes mindst for hver streng, for i alt: 200.000 * (8+8+16) ~ 6MB for hver af dine arrays.



lyder som om det er noget andet der er problemet.



ja ik

men jeg har lige idag genindstallerede windows og visual ultimate 2013


lad mig se er det sådan (50*36*100)string array*2600 stk oprettede*2byte = 936.000.000 byte det er jo ingen ting. Nå så må jeg undersøge min kode nøje. Men starter lige et nyt projekt lige for at teste



Indlæg senest redigeret d. 06.12.2016 23:54 af Bruger #21551
Nu skal jeg lige forstå dig korrekt. Du har en klasse, hvori et medlem er et array defineret noget lignende: Dim matrix(50, 36, 110) As String?

Så hvert array har: 50*36*110 ~ 200.000 elementer. Siden hvert element er en streng, er det minimum en reference som nok tager mindst 8 byte, hvilket giver: 1.600.000 ~ 1.52 MB. Garbage collectoren (den der rydder op i hukommelsen), har nok en reference til også, så det bliver ca. 3MB brugt hukommelse for en enkelt instans af klassen, og det er før du har fyldt strengene ud.

Dem laver så 2600 af: 2.600 * 3MB ~ 8GB. Så mindst 8GB - og det er kun at tage den store array i betragtning - men der er nok noget overhead i programmet som gør det et par gange større, så det lyder ikke så galt.

Ellers må du vise os noget kode, hvis der er noget misforstået.



Indlæg senest redigeret d. 07.12.2016 17:24 af Bruger #14645
Ja næsten 200.000 poster / elementer pr gang classen oprettes. Det havde jeg jo slet ikke brug for. Nu hedder den public indname(40,24,100) as string og jeg har max brug fir at oprette klassen ca 700 gange sat spærring ved 900 stk.
Me stupid monkey programmer click click



jeg ville kunne have en halv miliards strings før jeg løb ud af memory så det er jo ikke så lidt


I et stykke visual windows app software med 24gb ram ville man vel kunne have ca 12mia strings og 24mia integers.

Lige et følge spørgsmål stadigvæk om ram:
Fylder en public string meget ´mere end en dim string



Indlæg senest redigeret d. 07.12.2016 23:41 af Bruger #21551
Det er bare nemmere hvis man ser noget kode. Så "svesken på desken" hvis vi skal kloge os på det helt konkrete :-)



kort sagt jeg forstår godt jeg løb ud af hukommelse



t