将大型全局静态分配的数组转换为集合

时间:2017-05-23 13:02:14

标签: vb.net clr

我正在改进用VB.NET编写的应用程序。这是一个使用0.5GB(!)RAM的简单程序,因为有大量(30+)全局定义的数组,如:

Public Temp(1000000) As Double
Public ThisIsAnotherVariable(5000, 10) As String 
Public ThisIsAVeryLargeArray(64, 50000) As Double

大多数情况下,这些大型“缓冲区”几乎没有使用,所以我想将它们转换为使用Collections.Generic中的东西。是否有任何半透明的方式来转换这些?或者让CLR只分配使用过的段的一些技巧?

1 个答案:

答案 0 :(得分:1)

如果这些是“稀疏”数组,即几乎所有数组条目都是条目,最简单的解决方案可能是用字典替换它们:

Public Temp(1000000) As Double                     ' Old
Public Temp As New Dictionary(Of Int32, Double)()  ' New

作业与源代码兼容:

Temp(10) = 2.0    ' Works for arrays and dictionaries

阅读与源代码兼容,如果值存在

Dim x = Temp(3)   ' Works for arrays and dictionary, if Temp(3) has been assigned

但是,访问尚未分配的值将产生KeyNotFoundException。如果需要,则必须使用“默认值字典”而不是常规字典。不幸的是,BCL中没有内置这样的字典,但有others who have already looked at that problem and shared their implementation。如果要使用普通的.NET字典,则需要替换每个读取访问with a method call