在Classic ASP(VBScript)中,如果我尝试创建一个大的2维数组,我会收到“Out of Memory”错误。例如,这个
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()来获得给定x和y的val,但是每次我知道x和y时,这需要耗费时间遍历数组。有更好的解决方案吗?
答案 0 :(得分:11)
您正尝试将数组重新定义为10000 x 10000,即100,000,000个元素。
这是一个Variants数组,它需要一个连续的1.525 GB空间,只需要保存该数组。如果您在应用程序中进行其他工作,并且以32位运行,那么您的处理空间总计将限制为2GB。试图获得大块的问题。
一般情况下,我会避免尝试在基于Web的应用程序中进行这么大的分配。这应该保存在数据库中,并根据需要分页。如果您需要对数据进行处理,请在单独的服务中进行,而不是在ASP中进行。
答案 1 :(得分:4)
如果您有稀疏数组,请使用嵌套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)