【发布时间】:2014-05-04 05:29:50
【问题描述】:
我在 W2K12 R2(完全修补)上使用 powershell v4 将大量(100+ 百万)条记录插入 MySQL 数据库。我遇到了一个问题,尽管积极地删除变量和垃圾收集,内存使用量仍在不断增长。请注意,我正在运行脚本的机器上的内存使用量正在增长 - 而不是数据库服务器。
插入速度不错,作业运行良好。但是,我有一个内存泄漏,并且已经将我的头撞到墙上一个星期试图找出原因。我从测试中知道,内存在调用脚本的 MySQL 部分时会累积,而不是在其他任何地方。
我注意到,每次插入后,内存都会从 1MB 到 15MB 之间的任何地方增长。
这是该过程的基本流程(代码在底部)。 - 将记录添加到数组中,直到数组中有 1,000 条记录 -一旦有一千条记录,它们就会作为一个批次插入到数据库中 - 然后使用 .clear() 方法清空数组(我已经验证数组中保留了 0 条记录)。 -我在每次插入后都尝试过积极地收集垃圾(那里没有运气)。 -还尝试删除变量然后进行垃圾收集。还是没有运气。
为简洁起见,下面的代码进行了简化。但是,它显示了我如何遍历记录并进行插入:
$reader = [IO.File]::OpenText($filetoread)
$lineCount = 1
while ($reader.Peek() -ge 0) {
if($lineCount -ge 1000-or $reader.Peek() -lt 0) {
insert_into_db
$lineCount = 0
}
$lineCount++
}
$reader.Close()
$reader.Dispose()
一次调用建立连接:
[void][system.reflection.Assembly]::LoadFrom("C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.5\MySql.Data.dll")
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)
这里是对 MySQL 的调用,为每 1,000 条记录执行实际插入:
function insert_into_db {
$command = $connection.CreateCommand() # Create command object
$command.CommandText = $query # Load query into object
$script:RowsInserted = $command.ExecuteNonQuery() # Execute command
$command.Dispose() # Dispose of command object
$command = $null
$query = $null
}
如果有人有任何想法或建议,我会全力以赴!
谢谢, 杰里米
【问题讨论】:
-
您是否尝试过每 1000 行创建和处理一次连接对象以查看它是否会影响内存泄漏?不是最有效地利用资源,但可以提供信息(如果有用,您可以调整以每 100k 行或其他内容重新创建连接)。
-
其实,没有。我没试过。我绝对同意这不是很好地利用资源,但我会稍微尝试一下。我无法想象人们会忍受这样的事情。所以,它仍然让我想知道我做错了什么。
-
我刚刚试了一下。我在有和没有连接池的情况下都试过了。如果没有连接池,它会启动大量连接,并且在池化后不久它就会在达到池最大值后死亡。这两个选项都不会真正起作用:(
标签: mysql database powershell memory