我编写了以下程序,该程序读取并解析.ged文件(族谱数据)并将其存储在SQLite数据库中。该程序可以运行,但是当加载大文件时,出现“内存不足异常”。我是Visual Basic的新手,但似乎所有创建的对象都存储在内存中,直到程序结束为止,因为随着程序运行,内存使用量最多增加4个演出。
我已经搜索了所有内容,但找不到解决方案。救命!
我在服务器类中都有类似的Family和Child类,并且每个子类都有。
人员班级:
GDP
服务器:
GROUPED_BY
主程序:
MATCH (q:Query {summary: "Looking for Japan GDP"}),
(q) - [:FILTERED_BY] -> (filters),
(r:Record) - [:GROUPED_BY] -> (filters)
return r;
结束班级
这是从此VBA程序改编而成的:
Public Class Person
Public Property ID As String
Public Property personID As String
Public Property surName As String
Public Property givenName As String
Public Property sex As String
Public Property birthDate As String
Public Property birthYear As String
Public Property birthPlace As String
Public Property deathDate As String
Public Property deathYear As String
Public Property deathPlace As String
Public Property famC As String
End Class
我在代码中缺少这一部分吗?如果是这样,我需要用什么替换它?
Public Sub AddPerson(p As Person)
Dim addPersonquery As String = "INSERT INTO Person(
ID,
PersonID,
SurName,
GivenName,
Sex,
BirthDate,
BirthPlace,
DeathDate,
DeathPlace,
FamC)
VALUES(
@ID,
@pid,
@sn,
@gn,
@se,
@bd,
@bP,
@dd,
@dp,
@fc);"
Using SqlConn As New SQLiteConnection(AMconnectionString)
Dim cmd As New SQLiteCommand(addPersonquery, SqlConn)
cmd.Parameters.AddWithValue("@ID", p.ID)
cmd.Parameters.AddWithValue("@pid", p.personID)
cmd.Parameters.AddWithValue("@sn", p.surName)
cmd.Parameters.AddWithValue("@gn", p.givenName)
cmd.Parameters.AddWithValue("@se", p.sex)
cmd.Parameters.AddWithValue("@bd", p.birthDate)
cmd.Parameters.AddWithValue("@bp", p.birthPlace)
cmd.Parameters.AddWithValue("@dd", p.deathDate)
cmd.Parameters.AddWithValue("@dp", p.deathPlace)
cmd.Parameters.AddWithValue("@fc", p.famC)
SqlConn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
答案 0 :(得分:0)
不使用Using...End Using
可能导致内存问题。 .net中的变量是垃圾回收的。这是托管代码-读取托管内存。当对象使用非托管资源时会出现问题。为了清理这些资源,这些对象实现了IDisposable
,因此它们将具有Dispose()
方法。如果我们无法调用Dispose()
方法,则非托管资源会堆积并导致“内存不足”。一种简单的处理方法是使用Using...End Using
。
因此,Using块可确保处置 资源,无论您如何退出该区块。即使在 未处理异常的情况,SO异常除外
(来自ms docs)
您将使用代替Dim语句。
Using cn as New SqlConnection("Your connection string")
然后,当您完成连接使用后,...
End Using
一个警告,这是一个代码块,其中声明的任何内容在外部均不可见。在块之前声明并初始化您需要的任何变量。