2013-10-23 191 views
2

我的团队正在使用access 2000,在那里我们有我们的MDB项目。这个应用程序(ERP)可以打开大约20个访问表单。在我们决定将整个系统迁移到Access 2010之后,将其转换为新格式* .accdb;我们现在有更少的内存,现在大约有100MB。ACCESS 2010系统资源超标

是否有任何解决方法,我可以遵循的任何路径来增加我的访问权限2010项目内存限制。

问题流程:我们将登录名和密码放在初始表单中,并开始打开表单(从表单中直接获取表单)。当大约10个表单中,2010年访问使用的内存达到107MB,并且当我们打开下一个表单时,系统崩溃并出现以下错误:“3035说明系统资源超出”

+0

也许你会考虑重新设计的应用程序,所以它并不需要一次打开许多形式。你也可以确定从开放中停止“另外一个表格”实际上运行应用程序。可能你已经打开的一个表单已经占用了内存。 – HelloW

+0

该应用程序非常复杂,我们不能限制表单的数量,因为客户端不想要。我们一直在进行大约一百次的“再一次形式”测试。你是对的,一个打开的表单使用连接内存,发生内存限制问题。 –

+0

我们正在回访2000年,我们无法解决问题。 –

回答

3

问题是由32位访问造成的每个应用程序的32位Windows虚拟内存限制为2GB。我不知道为什么这个问题在Windows XP上没有出现(没有时间去测试它)。

您可以通过性能监视器或通过访问应用程序中的代码来跟踪VM使用情况。您将看到,随着表单的打开,虚拟机使用量会逐渐增加,直到访问虚拟机。

解决方案是在Windows 64位上切换到Access 64位。请记住,如果你有外部DLL调用,他们需要重写为64位。另外ActiveX控件需要是64位。


代码跟踪VM

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

大厦关闭由造币厂提供的VM跟踪代码,我做了一个排序为我的应用“预警”系统,警告您当VM正在接近开始导致问题并推荐重新启动的点。这有点烦人,但直到有人提出了在64位操作系统环境中运行的32位Office的更好解决方案之前,它必须这样做。

ReturnVM:返回GB中的虚拟内存使用情况,如果超过1.425GB则触发警报。我发现这适用于我的应用程序,在重新启动之间给予尽可能多的时间,同时仍然允许一些余地在重新启动之前完成工作。随时根据需要进行调整。

os_Restart:写入杀死活动的访问过程中一个批处理文件,删除剩余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 
+0

真的很好的做法。 –

1

后无奈的几个月里,我已经找到了原因,并在这两个访问2010年和2013年访问该解决方案已经在Skype的加载运行该程序时的后台在大型查询和紧凑和修复期间导致“系统资源超出错误”。

如果您仍然有在Windows XP兼容模式

1

这可能有助于为我所做运行问题: 激活系统管理上的所有驱动器分页。 为此,

  1. 右击“我的电脑”图标,选择“属性”,
  2. 进入“高级系统设置”>高级>设置>高级>更改,
  3. 取消选中“自动管理页面...'并逐个选择所有驱动器,并为每个驱动器设置“系统管理大小”。
  4. 按[确定],就完成了。

Example Screenshot