gpt4 book ai didi

perl - 识别 Perl/DBI 代码中的内存问题

转载 作者:行者123 更新时间:2023-12-05 00:56:23 24 4
gpt4 key购买 nike

首先 - 这不是我的代码 - 代码有问题,我正在尝试找出如何调试问题。如果有机会,我会对代码进行大量更改(过多的大括号、全局变量、使用 join 函数而不是 foreach 等)。它充满了不好的做法,但这不是我需要帮助的。

这是一段 Perl 代码(没有子例程,没有什么特别的 - 基本上是为查询结果打开一个文件,执行查询,并将结果转储到一个文件中):

# earlier in the program, @row, $field, and $output are all declared globally, like this:
my @row;
my $field;
my $output;

# a file is opened for output, with filehandle ROWOUT
# a database statement handle (DBD::DB2) is executed

while ( @{row} = ${sth}->fetchrow_array ) {
foreach ${field}( @{row} ) {
${field} =~ s/\s+$//;
${output} = "${output}\~${field}";
}

${output} =~ s/\~//;
print ROWOUT "${output}\n";
undef ${output};
}

在 while 循环的某处,Perl 脚本因 Out of Memory! 错误而崩溃(不是干净的崩溃 - 它只是停止运行并显示该消息。)

在大多数运行中,此查询的量非常小。这次脚本崩溃时的查询结果要大很多(仍然不是很大):150,000 行,每行大约 1200 字节宽。

我想到的事情:

  1. DBI 的 fetchrow_array 函数足够聪明,不会将完整的数据集拉入内存,对吗?我的假设是数据在数据库中,并且 fetchrow_array 一次检索一行,因此即使您有 100 亿行,也不应该出现内存问题 - 对吗?
  2. $output 变量上调用undef 将释放它正在使用的内存,对吗?如果没有,那可能是另一个可能存在内存问题的地方。
  3. @row 变量使用的内存将在每次检索新行时重新使用(?),对吗?如果没有,我可以看到使用全局数组存储每一行​​会如何耗尽内存。

我希望有一些明显的东西我只是不理解。如果通过查看代码没有明显的问题,我可以使用哪些技术来调试此问题?

提前致谢!

最佳答案

这可能是因为您(可能是无意中)缓存了太多行。您可以通过检查 $sth->{RowsInCache} 来了解已经引入了多少。如果是undef,则没有缓存,否则会给出行数。

您还可以通过如下重写它来摆脱您必须使用 $output 进行的体操操作:

while ( my @this_row = $sth->fetchrow_array ) {
# Get rid of this line once you figure out your memory problem.
print STDERR "Using ", ($sth->{RowsInCache} || 0), " rows in cache\n";

print ROWOUT join('~', map { s/\s+$// } @this_row), "\n";
}

因此,假设您的缓存中有太多行,您可以通过以下方式限制它:

my $dbh = DBI->connect($dsn, $user, $pass, { RowCacheSize => 20 })
or die "Cannot connect to $dsn: $DBI::errstr\n";

根据 DBI 文档,您可以使用如下值来控制缓存(假设您的驱动程序支持它):

 0 - Automatically determine a reasonable cache size for each C<SELECT>
1 - Disable the local row cache
>1 - Cache this many rows
<0 - Cache as many rows that will fit into this much memory for each C<SELECT>.

关于perl - 识别 Perl/DBI 代码中的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com