我有一个应用程序来处理仓库中手持终端的扫描事务。每次扫描(其中一天可能有数十万次扫描)必须查找拾取位置(同样可以有数十万个)来查找其“物理位置”。为了获得处理速度,我需要将整个位置列表拉入字典中,因此它在RAM中,但这自然会对系统内存产生影响,并且每隔几天就会出现“系统内存不足”错误(系统在虚拟服务器上不断运行。我的问题是:我的做法是否明智?这是(我相信)在系统中访问数据的最快方法吗?有什么想法可以帮助解决内存问题吗?
For x = 1 To MapBindingSource.Count
Dim B As New Bin
B.LocationID = MapBindingSource.Current("LocationID")
B.x = MapBindingSource.Current("X")
B.y = MapBindingSource.Current("Y")
B.z = MapBindingSource.Current("Z")
'etc...
Try
BinDictionary.Add(B.LocationID, B)
Catch ex As Exception
msgbox("Error message here")
End Try
MapBindingSource.MoveNext()
Next
明智的是意见问题,完全取决于具体情况(例如,数据量,硬件有多强大,需要多快,数据格式是什么)。 Dictionary
使用哈希表来索引数据。这是否是使用全部的最快数据结构取决于数据以及它发生变化的频率。有许多其他流行的数据结构可能更好 - 一些内置于.NET(例如HashSet
,SortedList
,SortedDictionary
)和许多不是。但这是一个非常广泛的话题。
解决此问题的最常见方法是使用具有适当调整的数据库的良好数据库引擎。在大多数情况下,数据库应该获得几乎同样好的性能,因为它将使用作业的最佳数据结构索引所有内容,并且它将有效地将所有内容缓存在内存中。它不仅可以为您处理所有工作,还可以添加更多您可以在将来使用的功能。如果您已经在使用数据库,我建议尝试其他引擎和配置,因为它不应该那么慢。
就内存耗尽而言,最简单的答案是,如果将进程更改为64位,则不应该成为问题。当应用程序作为32位进程运行时,它被限制为2GB或内存(当您考虑开销和碎片时,它通常接近1.5GB)。当它以64位运行时,它会获得更大的内存空间,几乎肯定比机器上的物理RAM和虚拟内存大,因此您只能受到想要投入的硬件数量的限制。但是,你描述这种情况的方式听起来很可疑。如果在启动时将所有数据加载到内存中,这就是导致内存不足的原因,它应该会立即失败并出现内存不足的异常。如果它在一两天内没有失败,那么您的应用程序中可能存在内存泄漏。如果是这种情况,切换到64位将使其运行更长时间,但只会延迟不可避免的。