从 Ram 中清除字典
Clearing Dictionary From Ram
微软访问 2013
我的目标是构建人行横道 table,但我无法在 Memo/Long 文本字段上加入并且使用带有 where 语句而不是加入的更新查询效率低下并且挂起,所以我决定构建一个字典来填充它,并通过查找 ID 来填充下一列,问题是我 运行 变成 "Overflow" 问题 - 我的假设是 RAM 限制。我的工作是尽可能多地填充到字典中,从该子集中填充我可以填充的内容,清除字典并用下一批再次填充它 - 漂洗重复。但是,在第一批 运行 并从字典中清除后,我在试图放入 'empty' 字典的下一个 Key/Value 对中收到溢出错误 - 并且不知道为什么。
Ideal JOIN SQL 语句(带有长文本/备注问题):
UPDATE [ID Crosswalk] INNER JOIN [1 Clean Reasons] ON [ID Crosswalk].Reason = [1 Clean Reasons].Reason SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason];
WHERE SQL 语句 (Non-functioning/Hanging):
UPDATE [ID Crosswalk], [1 Clean Reasons] SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason]
WHERE ((([ID Crosswalk].Reason)=[1 Clean Reasons].[Reason]));
VBA字典解法(溢出错误):
Dim CRtbl as DAO.Recordset
Dim CRDictNT as Dictionary
Set CRDictNT = New Dictionary
'Fill CR Dict
CRtbl.MoveFirst
On Error GoTo PrintCR
Do Until CRtbl.EOF
Do Until CRtbl.EOF
CRDictNT.Add CStr(CRtbl("Reason")), CInt(CRtbl("CR_ID")) 'CR_ID by Reason
CRtbl.MoveNext
Loop
PrintCR:
CWIDtbl.MoveFirst
Do Until CWIDtbl.EOF
If Not IsEmpty(CRDictNT(CWIDtbl("Reason"))) Then
CWIDtbl("CR_ID") = CRDictNT(CWIDtbl("Reason"))
End If
CWIDtbl.MoveNext
Loop
CRDictNT.RemoveAll 'these three lines are
Set CRDictNT = Nothing 'my attempts at clearing
Set CRDictNT = New Dictionary 'the item from RAM.
Loop
CRtbl.Close
问题不在于您的词典,而是您正在执行的转换。 VBA 整数很小(带符号的 16 位,最大值为 32,767)。因此,当您使用大于该 ID 的 ID 调用 CInt(CRtbl("CR_ID"))
时,您将溢出它尝试 return 的整数。使用 CLng()
改为转换为 Long(带符号的 32 位,最大值为 2,147,483,647)。确保您还重构了其余代码以正确期待 Long。
我刚刚做了一个小测试,只留下字典 运行 一段时间,添加项目(键是一个短字符串,值是一个递增的 Long,类似于你的情况)。它 运行 在我将其切断之前有 300 万个条目,并且它没有抱怨任何溢出或其他错误(并且主机进程的总内存使用量仅为 ~0.5GB)。所以你应该可以随意填充你的字典而不用担心内存。
微软访问 2013
我的目标是构建人行横道 table,但我无法在 Memo/Long 文本字段上加入并且使用带有 where 语句而不是加入的更新查询效率低下并且挂起,所以我决定构建一个字典来填充它,并通过查找 ID 来填充下一列,问题是我 运行 变成 "Overflow" 问题 - 我的假设是 RAM 限制。我的工作是尽可能多地填充到字典中,从该子集中填充我可以填充的内容,清除字典并用下一批再次填充它 - 漂洗重复。但是,在第一批 运行 并从字典中清除后,我在试图放入 'empty' 字典的下一个 Key/Value 对中收到溢出错误 - 并且不知道为什么。
Ideal JOIN SQL 语句(带有长文本/备注问题):
UPDATE [ID Crosswalk] INNER JOIN [1 Clean Reasons] ON [ID Crosswalk].Reason = [1 Clean Reasons].Reason SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason];
WHERE SQL 语句 (Non-functioning/Hanging):
UPDATE [ID Crosswalk], [1 Clean Reasons] SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason]
WHERE ((([ID Crosswalk].Reason)=[1 Clean Reasons].[Reason]));
VBA字典解法(溢出错误):
Dim CRtbl as DAO.Recordset
Dim CRDictNT as Dictionary
Set CRDictNT = New Dictionary
'Fill CR Dict
CRtbl.MoveFirst
On Error GoTo PrintCR
Do Until CRtbl.EOF
Do Until CRtbl.EOF
CRDictNT.Add CStr(CRtbl("Reason")), CInt(CRtbl("CR_ID")) 'CR_ID by Reason
CRtbl.MoveNext
Loop
PrintCR:
CWIDtbl.MoveFirst
Do Until CWIDtbl.EOF
If Not IsEmpty(CRDictNT(CWIDtbl("Reason"))) Then
CWIDtbl("CR_ID") = CRDictNT(CWIDtbl("Reason"))
End If
CWIDtbl.MoveNext
Loop
CRDictNT.RemoveAll 'these three lines are
Set CRDictNT = Nothing 'my attempts at clearing
Set CRDictNT = New Dictionary 'the item from RAM.
Loop
CRtbl.Close
问题不在于您的词典,而是您正在执行的转换。 VBA 整数很小(带符号的 16 位,最大值为 32,767)。因此,当您使用大于该 ID 的 ID 调用 CInt(CRtbl("CR_ID"))
时,您将溢出它尝试 return 的整数。使用 CLng()
改为转换为 Long(带符号的 32 位,最大值为 2,147,483,647)。确保您还重构了其余代码以正确期待 Long。
我刚刚做了一个小测试,只留下字典 运行 一段时间,添加项目(键是一个短字符串,值是一个递增的 Long,类似于你的情况)。它 运行 在我将其切断之前有 300 万个条目,并且它没有抱怨任何溢出或其他错误(并且主机进程的总内存使用量仅为 ~0.5GB)。所以你应该可以随意填充你的字典而不用担心内存。