2

En ASP classique (VBScript), si j'essaie de créer un grand tableau 2-dimensinal, j'obtiens une erreur «Mémoire insuffisante». Par exemple, ceUn grand tableau VBScript génère une erreur «Mémoire insuffisante»

DIM xxx : xxx = 10000 
DIM yyy : yyy = 10000 
REDIM aaa(xxx, yyy) 
Response.End 

yeilds cette

Microsoft VBScript runtime error '800a0007' 

Out of memory 

Leur autre structure de données que je peux utiliser qui fonctionne, ou une autre solution de contournement? MISE À JOUR: Suite à une étude plus approfondie de ce code hérité sur lequel je travaille, le tableau est clairsemé. En d'autres termes, seule une partie des emplacements de tableau sont nécessaires. Comme ceci:

aaa(0, 0) = 1.23 
aaa(101,12) = 1.57 
aaa(3020,1200) = 2.58 
etc. 

Je pensais à changer les choses pour stocker les valeurs comme ceci:

aaa(count) = "xxx,yyy,val" 

puis à l'aide de Split() pour obtenir donné val x et y, mais qui nécessite un temps boucle à travers le tableau chaque fois que je connais x et y. Y a-t-il une meilleure solution?

+2

Vous aurez besoin de donner au moins un exemple de ce que vous voulez faire avec cette mémoire. La structure des données dépend de l'utilisation ... –

+1

Est-ce que vous vous attendez à ce que tous les éléments aient une valeur significative ou est-ce que la population de cette rangée serait vraiment assez éparse? – AnthonyWJones

+0

En fait, il sera assez clairsemé. (C'est le code de quelqu'un d'autre sur lequel je travaille, BTW.) Pouvez-vous penser à un meilleur mécanisme de stockage? J'ai pensé à utiliser un tableau plat de triplets: array() = "x, y, val" et ensuite en utilisant Split() pour obtenir 'val' donné x et y, mais le processus de récupération est lent. – twh

Répondre

4

Si vous avez un tableau clairsemé, utilisez un Scripting.Dictionary imbriqué pour le stocker. C'est probablement le moyen le plus simple et le plus efficace de VBScript (à l'exception d'une bibliothèque COM pour les tableaux clairsemés).

Set arr = CreateObject("Scripting.Dictionary") 

' Adding a column: ' 
Dim NewCol 
NewCol = CreateObject("Scripting.Dictionary") 
arr.Add row, NewCol 

' Adding a value in an (existing!) row/column: ' 
If arr.Exists(row) Then _ 
    arr(row).Add column, value 

' Retrieving a value: ' 
? arr(row)(column) 
11

Vous essayez de redimensionner le tableau à 10000 x 10000, ce qui représente 100 000 000 éléments.

Ceci est un tableau de Variantes, qui nécessite un seul bloc contigu de 1,525 Go, juste pour contenir ce tableau. Si vous effectuez un autre travail dans l'application et que vous exécutez en 32 bits, vous allez être limité à 2 Go au total pour votre espace de traitement. Essayer d'obtenir un morceau aussi gros est problématique.

En général, j'éviterais d'essayer de faire des allocations aussi grandes dans une application Web. Cela doit être enregistré dans la base de données et les données paginées si nécessaire. Si vous devez effectuer un traitement sur les données, faites-le dans un service distinct, pas dans ASP.

+3

+1 Le tableau sera toujours un tableau de variantes qui ont une taille de 16 octets, donc environ 1,5 Go est alloué. – AnthonyWJones

+0

ooo -yeah, vrai, j'ai oublié ça dans VBScript. Edité pour refléter cela ... –

Questions connexes