L'istruzione \"Dim\"...

di il
2 risposte

L'istruzione \"Dim\"...

Salve!
Avrei da porre alcune domande riguardo questa istruzione utilizzata in vbscript.
Premetto che uso un computer Pentium 4 3Ghz. con 2Gb. di memoria ram a bordo.
Prendiamo ad esempio la seguente dichiarazione:

Dim matrice(6000000,8)
A questo punto se mando lo script in esecuzione prosegue tranquillamente attingendo dal sistema circa 1Gb. di memoria fisica ram, ma se provo ad aumentare gli elementi della matrice, mi appare il messaggio di:\"errore 7: memoria esaurita\"
Questo è strano, perchè ho ancora quasi 1Gb. di memoria ram fisica disponibile da sfruttare.
Qualcuno sarebbe così gentile da darmi qualche spiegazione e magari aiutarmi a risolvere il problema?
Ringrazio in anticipo tutti per la collaborazione.

Cordiali saluti

2 Risposte

  • Re: L'istruzione \"Dim\"...

    Ci stanno comunque altre applicazioni residenti in memoria (incluso il kernel del sistema operativo) quindi parte di quei 2 giga di memoria già sono occupati a prescindere
  • Re: L'istruzione \"Dim\"...

    La matrice che stai definendo è di tipo variant di conseguenza la dimensione di un singolo elemento può essere:

    1) 16 bytes Any numeric value
    2) 22 bytes + string length Same range as for variable-length String

    a cui vanno aggiunte le seguenti considerazioni:

    Note: Arrays of any data type require 20 bytes of memory plus 4 bytes for each array dimension plus the number of bytes occupied by the data itself. The memory occupied by the data can be calculated by multiplying the number of data elements by the size of each element. For example, the data in a single-dimension array consisting of 4 Integer data elements of 2 bytes each occupies 8 bytes. The 8 bytes required for the data plus the 24 bytes of overhead brings the total memory requirement for the array to 32 bytes.
    A Variant containing an array requires 12 bytes more than the array alone.



    Di conseguenza la quantità di byte allocata nello stack per la tua matrice è pari a: Dimensione 1 matrice * Dimensione 2 matrice * 22 (caso peggiore a cui vanno aggiunti anche una serie di byte di corredo così come indicato nella voce note)

    Se tieni presente che per ogni applicazione che viene lanciata in windows possono essere allocati msx 2^32 byte (dimensione massima oltre la quale si ha un crash dell'applicativo) e tenendo conto della suddivisione in heap e stack della memoria e considerando le capacità del servizio di di elaborazione script e tenendo conto delle dimensioni della tua matrice più una serie di altre considerazioni di contorno (non voglio dilungarmi) otterrai come risultato di tutti questi ingrendienti un inevitabile blocco dello script;

    P.S. Il fatto che tu veda occupata solo una parte della memoria è relativo visto che non tieni in considerazione i file di swap del sistema operativo.
Devi accedere o registrarti per scrivere nel forum
2 risposte