Erreur 7 : mémoire insuffisante

Bonjour le forum,
J'utilise un type de données personnalisé que je réemploie dans une variable tableau à 3 dimensions :
Private Type Node
    IC As Integer
    TC As Long
    Path As Byte
 End Type

Private Nodes() As Node

Sub test()
    For i = 700 To 800
        ReDim Nodes(i, i, i)
        Erase Nodes
    Next
End Sub

Et malgré ma RAM conséquente (32Go) test se met en erreur 7 quand i atteint la valeur : 710.

Quelqu'un aurait-il une solution qui me permettrait de dépasser cette limite ? (Utiliser la mémoire virtuelle ? Mais alors comment faire ?).
Merci par avance

Bonjour,

Une réponse de ChatGPT

L'erreur 7 correspond à une "mémoire insuffisante" (Out of Memory) en VBA. Cela se produit parce que le code essaie d'allouer une quantité de mémoire trop importante pour le tableau Nodes.

Pour mieux comprendre ce qui se passe, analysons le code et les tailles de mémoire impliquées :

Définition du type Node :

IC est un entier (Integer), ce qui prend 2 octets.
TC est un long (Long), ce qui prend 4 octets.
Path est un octet (Byte), ce qui prend 1 octet.
Donc, chaque Node prend 2 + 4 + 1 = 7 octets.

Dimensionnement dynamique du tableau Nodes :

La boucle fait varier i de 700 à 800.
À chaque itération, le tableau Nodes est redimensionné en utilisant ReDim Nodes(i, i, i).
La taille totale du tableau à chaque itération serait i * i * i.
Calculons la mémoire requise pour i = 710 :

710 * 710 * 710 = 357911000 éléments.
Chaque élément prend 7 octets.
Donc, la mémoire totale nécessaire est 357911000 * 7 = 2505377000 octets (environ 2,5 Go).
Cette quantité de mémoire est très élevée et dépasse probablement la limite que VBA peut allouer, d'où l'erreur de mémoire insuffisante. Les systèmes 32 bits, qui sont souvent utilisés pour les applications VBA, ont une limite d'allocation de mémoire par processus bien en deçà de 2 Go, généralement autour de 1 à 1,5 Go.

Solutions possibles
Réduire la taille du tableau :

Si possible, essayez de réduire les dimensions du tableau pour qu'il nécessite moins de mémoire.
Utiliser des types de données plus efficaces :

Réévaluez si tous les types de données sont nécessaires, et s'ils peuvent être optimisés (par exemple, remplacer Long par Integer si les valeurs sont suffisamment petites).
Optimiser la logique du code :

Si vous n'avez pas besoin de redimensionner le tableau à chaque itération, réorganisez le code pour éviter de telles opérations coûteuses en mémoire.
Utiliser des structures de données alternatives :

Si vous avez besoin de structures de données de grande taille, envisagez d'utiliser d'autres outils ou langages mieux adaptés à la gestion de grandes quantités de mémoire (comme Python, C++, etc.).

Bonjour,

Ce n'est pas un pb de manque de RAM. Avec 16 Go j'ai la même limitation.
La mémoire virtuelle se règle dans les paramètres windows où le réglage par défaut 'Automatique' est le mieux. Tu peux imposer le disque, la taille mini et la taille maxi mais je ne pense pas que c'est là que se situe le pb

Je pensais à la limite des 2 Go/session qui existait avant pour les feuilles mais elle a disparu (ou fortement augmenté) avec la version 64 bits.
J'avais noté que 2016 64 bits semble avoir une limite de mémoire d'environ 4 Go pour VBA. Il reste peut-être de telles limites indépendantes de la taille de ta RAM (?)

Cependant j'ai fait un test qui semble intéressant :

Sub test()
    Dim Nodes() As Node, Nodes2() As Node
    Dim i As Long, j As Long
    For i = 700 To 800
        ReDim Nodes(i, i, i / 2)
        ReDim Nodes2(i, i, i / 2)
        Erase Nodes
        Erase Nodes2
    Next i
End Sub

En faisant 2 paquets ont atteint les 800.
Il y a bien il limite, mais ce ne serait pas une par session. Les piles en ont mais je ne vois pas ce qu'une pile ferait ici
Plus chiant à gérer mais en attendant mieux...
eric

Bonjour et merci beaucoup à vous deux JExcel2fr et eriiic !

Il y a de bonnes pistes dans vos deux réponses, oui passer à Python pourrait-être une solution très satisfaisante. Pour la solution d'eriiic je vais tester ça ce soir ça pourrait être aussi une option.

Je reviens à vous demain !

j'ajoute que quand excel a besoin d'un bloc mémoire, il veut un bloc continu.
Si la mémoire est fragmentée il n'est pas sûr que windows puisse lui attribuer, même s'il y a 10 fois plus de place disponible pour la taille du bloc demandé.
Ca peut expliquer certaines erreurs 7

Bonjour,

Les objets VB.NET sont ils soumis aux memes limitations ? Je pensais aux ArrayList notamment.

Bonjour,

Que fait tu des 699 premier enregistrement de ton tableau ?

Sub test()
    For i = 700 To 800
        ReDim Nodes(700 to i,700 to  i, 700 to i)
        Erase Nodes
    Next
End Sub

Bonjour à tous,

Je mets le sujet en solutionné par JExcel2fr merci beaucoup je vais essayer de me mettre à Python !

Et un petit vote pour eriiic pour la qualité de sa réponse à lui aussi.

A dysorthographie : c'était juste un petit test je savais déjà qu'en dessous de 700 ça passerait !

Grand merci à vous

Rechercher des sujets similaires à "erreur memoire insuffisante"