Большой массив VBScript выдает ошибку «Недостаточно памяти» - PullRequest
2 голосов
/ 26 января 2010

В классическом ASP (VBScript), если я пытаюсь создать большой 2-мерный массив, я получаю ошибку «Недостаточно памяти». Например, это

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

даёт это

Microsoft VBScript runtime error '800a0007' 

Out of memory

Будет ли работать другая структура данных, которую я могу использовать, или какой-то другой обходной путь?

(2010-01-27) ОБНОВЛЕНИЕ: После дальнейшего изучения этого устаревшего кода, над которым я работаю, массив редкий. Другими словами, требуется только часть заполнителей массива. Как это:

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

Я думал о том, чтобы что-то изменить, чтобы сохранить значения следующим образом:

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

и затем использование Split () для получения значения val заданных x и y, но для этого требуется трудоемкий цикл прохождения массива каждый раз, когда я знаю x и y Есть ли лучшее решение?

Ответы [ 2 ]

11 голосов
/ 26 января 2010

Вы пытаетесь изменить размер массива до 10000 x 10000, что составляет 100 000 000 элементов.

Это массив вариантов, для которого требуется один непрерывный блок размером 1,525 ГБ, просто для хранения этого массива. Если вы выполняете другую работу в приложении и работаете в 32-битной среде, общее пространство для вашего процесса будет ограничено 2 ГБ. Попытка получить большой кусок проблематична.

В общем, я бы избегал таких больших выделений в веб-приложении. Это должно быть сохранено в базе данных, а данные выгружены по мере необходимости. Если вам нужно выполнить обработку данных, сделайте это в отдельной службе, а не в ASP.

4 голосов
/ 27 января 2010

Если у вас есть разреженный массив, используйте вложенный Scripting.Dictionary для его хранения. Это, вероятно, самый простой и эффективный способ в VBScript (за исключением библиотеки COM для разреженных массивов).

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)
...