我的团队正在使用Access 2000,我们有MDB项目。该应用程序(ERP)可以打开大约20个访问表单。在我们决定将整个系统迁移到Access 2010到新格式之后,* .accdb;我们现在遇到的问题是内存减少,大约100mb。
是否有任何解决方法,我可以遵循的任何路径来增加我的访问2010项目内存限制。
问题流程:我们将登录名和密码放在初始表单中,然后开始打开表单(从表单中获取表单)。当大约10个表单时,acess 2010使用的内存达到107mb,当我们打开下一个表单时,系统崩溃并出现以下错误:“3035说明系统资源已超出”
答案 0 :(得分:3)
该问题是由32位访问超过每个应用程序的32位Windows虚拟内存限制2GB引起的。我不知道为什么这个问题不会出现在Windows XP上(没时间测试它)。
您可以通过性能监视器或访问应用程序中的代码跟踪VM使用情况。您将看到,随着表单打开,VM使用率逐渐增加,直到访问balks。
解决方案是在Windows 64bit上切换到Access 64位。请记住,如果您有外部dll调用,则需要重写64位。 ActiveX控件也需要64位。
跟踪虚拟机的代码
Declare PtrSafe Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
Public Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type
Function ReturnVirtualMemory() As Long
Dim Mem as MEMORYSTATUS
Mem.dwLength = Len(Mem)
GlobalMemoryStatus Mem
ReturnVirtualMemory = Mem.dwTotalVirtual - Mem.dwAvailVirtual
End Function
答案 1 :(得分:1)
建立Mint提供的虚拟机跟踪代码,我做了一个早期警告'我的应用程序的系统,当VM接近它开始导致问题并建议重新启动时,它会发出警告。这有点令人讨厌,但是直到有人想出一个在64位操作系统环境中运行的32位Office的更好的解决方案,它必须做。
ReturnVM:以GB为单位返回虚拟内存使用量,如果超过1.425GB则触发警报。我发现这适用于我的应用程序,在重新启动之间给予尽可能多的时间,同时仍然允许一些余地在重新启动之前完成工作。随意根据需要进行调整。
os_Restart:写入一个批处理文件,该文件终止活动的Access进程,删除剩余的laccdb文件并重新启动应用程序(提供用户桌面上的所有内容)。写完文件后,它会执行批处理。另一个函数在应用程序启动时删除此文件。
TempVars!tv_WinUID = Environ(" USERNAME")
Function ReturnVM() As Double
Dim Mem As MEMORYSTATUS
Dim Result As Integer
Mem.dwLength = Len(Mem)
GlobalMemoryStatus Mem
ReturnVM = Format((Mem.dwTotalVirtual - Mem.dwAvailVirtual) / 1073741824, "0.000")
Debug.Print ReturnVM & " GB of VM used."
If (ReturnVM >= 1.425) Then
DoEvents
Result = MsgBox("Office Virtual Memory usage is approaching the pre-set limit." & vbCrLf & vbCrLf & "To prevent a possible crash, please click 'OK' to restart immediately." & vbCrLf & vbCrLf & "You may click 'Cancel' to finish what you're working on, but if you do, please restart the application as soon as possible.", vbOKCancel)
If (Result = vbOK) Then
os_Restart
End If
End If
End Function
Public Function os_Restart()
Dim fso As Object
Dim oFile As Object
Dim BatchContents As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.CreateTextFile("C:\Users\" & TempVars!tv_WinUID & "\Desktop\RestartAccess.bat")
BatchContents = "@echo Restarting Application..." & vbCrLf & _
"@echo off" & vbCrLf & _
"taskkill /f /im MSACCESS.EXE" & vbCrLf & _
"ping -n 6 127.0.0.1 > nul" & vbCrLf & _
"del " & Chr(34) & "C:\Users\" & TempVars!tv_WinUID & "\Desktop\Application.laccdb" & Chr(34) & vbCrLf & _
"start " & Chr(34) & Chr(34) & " " & Chr(34) & "C:\Users\" & TempVars!tv_WinUID & "\Desktop\Application.accdb" & Chr(34)
DoEvents
'Debug.Print BatchContents
oFile.WriteLine BatchContents
oFile.Close
Set fso = Nothing
Set oFile = Nothing
Call Shell("C:\users\" & TempVars!tv_WinUID & "\Desktop\RestartAccess.bat")
End Function
答案 2 :(得分:1)
经过几个月的挫折之后,我在Access 2010和Access 2013中找到了原因和解决方案。在运行程序时在后台加载Skype导致"系统资源超出错误"在大型查询和紧凑和修复期间。
如果在Windows XP兼容模式下运行仍有问题
答案 3 :(得分:1)
这可能对我有所帮助: 在所有驱动器上激活系统管理的分页。 为此,