"Out of Memory" avec Excel 2016 64-bit [Résolu]

Messages postés
10
Date d'inscription
samedi 22 mars 2014
Statut
Membre
Dernière intervention
15 juillet 2019
-
Bonjour tout le monde,

Je développe un code vba sur Excel qui 1) stocke virtuellement des données de fichiers texte et 2) effectue des opérations pour de l'analyse de données.
J'obtiens une "Run-Time Error 7: Out of Memory" au moment de redimensionner une Variant Array à
(1 To 1, 1 To 87, 1 To 4000, 1 To 37, 1 to 14)
.

Je pensais pourtant qu'en utilisant la version 64 bit d'Excel 2016 je ne serais limité que par la RAM (jusqu'à 8TB selon: https://support.microsoft.com/en-gb/help/3066990/memory-usage-in-the-32-bit-edition-of-excel-2013-and-2016)
Or mon utilisation de RAM n'atteint que 11GB/128GB à son pique.

Je précise que j'utilise l’environnement Windows Server 2012 R2 64 bits

J'ai cherché une explication sur des forums sans succès. Y a t'il des limitations sur Excel 2016 64 bit que j'ignore? Existe t'il une solution à ce problème de mémoire?

Merci d'avance!
Sam
Afficher la suite 

3 réponses

Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
177
0
Merci
En calculant rapidement, cela fait
180'264'000 éléments
Un variant c'est 16 octets (sans compter la taille de la donnée (si String par exemple, ajoutes la taille de la chaine + 22 octets pour les chaines) ) donc cela fait :
2'884'224'000 octets
A mon avis tu emplafonnes largement la limite de 2Go des limites du VBA (32 bits).
Si déjà tu typais correctement tes données, tu pourrait limiter la taille en mémoire.
Ensuite, regardes les structures (Type en VBx) pour avoir des données structurées. (De plus les tableaux multi dimensionnels sont vivement déconseillés dès que tu dépasse 2 dimensions)

Et comme on ne le rappel jamais assez, VBA ne sert pas à faire des traitements complexes, c'est un détournement de fonctionnalité.
Dans ton cas, si tu dois manipuler autant de données, il faut peut être revoir la technologie utilisée, une BDD ou/et un langage plus moderne est peut être à préférer.

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
SamSpartan93
Messages postés
10
Date d'inscription
samedi 22 mars 2014
Statut
Membre
Dernière intervention
15 juillet 2019
-
Merci pour ta réponse NHenry.

1) Je suis d'accord pour le typage des données. Il se trouve que les données que j'exploite sont de types différents et que les gérer avec des Variant Array est beaucoup plus pratique.

2) Je précise de nouveau que j'utilise la version 64 bit d'Excel, et donc je ne m'attends pas à avoir les limitations des versions 32 bit.

3) Effectivement je vais voir à adapter mon code pour qu'il stocke les données sur une BDD plutôt que virtuellement. Cela dit mon code est plutôt long et j'ai besoin à court terme de l'analyse qu'il est sensé effectuer. Solutionner l'erreur de limitation en mémoire est vraiment la priorité pour moi en ce moment.

Sam
Commenter la réponse de NHenry
Messages postés
7828
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
11 octobre 2019
1220
0
Merci
Bonjour,

Si tu ne fait que du traitement de données, au lieu de toutes les stocker, utilises un Flux (ADODB )
Commenter la réponse de Patrice33740
Messages postés
10
Date d'inscription
samedi 22 mars 2014
Statut
Membre
Dernière intervention
15 juillet 2019
0
Merci
Bon j'ai fait quelques tests avec différentes dimensions et type d'Array.

La conclusion à laquelle j'arrive est que je suis limité à 4GB par Array sur Excel 2016 en 64 bits (ce qui est confirmé par www.decisionmodels.com/memlimitsc.htm). Cela dit je peux créer autant d'Array que je veux tant que la somme totale de leur mémoire allouée n'excède pas la mémoire RAM disponible.

J'ai donc effectué des changements sur mes Array à problèmes:
1) Changer leur type en Single (4 Bytes) pour prendre 6 fois moins de mémoire que le Variant (24 Bytes).
2) Fragmenter ces Array en plusieurs Array en rassemblant les valeurs par en fonction de leur type pour gagner de la mémoire.

Je trouve tout de même dommage d'imposer ces limitations de nos jours.

Merci à vous pour vos réponses, je prends note de vos conseils et je vais me mettre à la base de données pour ne plus avoir ce problème sur le long terme.

Sam
Commenter la réponse de SamSpartan93