3

我的团队正在使用 access 2000,我们在那里有我们的 MDB 项目。这个应用程序(ERP)可以打开大约 20 个访问表单。在我们决定将整个系统迁移到 Access 2010 到它的新格式 *.accdb 之后;我们遇到了内存较少的问题,现在大约 100mb。

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

问题的流程:我们将登录名和密码放在初始表单中,然后开始打开表单(访问表单的表单,字面意思)。当大约10个表单时,access 2010使用的内存达到107mb,当我们打开下一个表单时,系统崩溃并出现以下错误:“3035说明系统资源超出”

4

4 回答 4

6

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

您可以通过性能监视器或访问应用程序中的代码跟踪 VM 使用情况。您会看到,随着表单的打开,VM 使用率逐渐上升,直到访问中断。

解决办法是在windows 64bit上切换到Access 64bit。请记住,如果您有外部 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
于 2013-11-16T17:36:03.443 回答
3

这可能对我有帮助:在所有驱动器上激活系统管理的分页。为了这,

  1. 右键单击“我的电脑”图标并选择“属性”,
  2. 转到“高级系统设置”>“高级”>“设置”>“高级”>“更改”,
  3. 取消选中“自动管理分页...”并一一选择所有驱动器并为每个驱动器设置“系统管理大小”。
  4. 按 [OK] 就完成了。

示例截图

于 2016-07-27T07:00:22.610 回答
2

经过数月的挫折,我在 Access 2010 和 Access 2013 中都找到了原因和解决方案。在运行程序时在后台加载 Skype 会导致在大型查询以及压缩和修复期间出现“系统资源超出错误”。

如果在 windows xp 兼容模式下运行仍有问题

于 2015-02-06T17:19:32.060 回答
2

基于 Mint 提供的 VM 跟踪代码,我为我的应用程序制作了一种“早期警告”系统,当 VM 接近将开始导致问题的点时会向您发出警告并建议重新启动。这有点烦人,但除非有人想出一个更好的解决方案来解决在 64 位操作系统环境中运行的 32 位 Office,否则它必须这样做。

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

os_Restart:编写一个批处理文件,杀死活动的 Access 进程,删除剩余的 laccdb 文件并重新启动应用程序(假设一切都在用户的桌面上)。写入文件后,它执行批处理。另一个函数在应用程序启动时删除此文件。

TempVars!tv_WinUID = 环境(“用户名”)

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
于 2014-12-09T22:18:08.853 回答