【发布时间】:2013-04-30 21:38:42
【问题描述】:
更新:
现在我正在尝试接收大约 120M 行的数组。我不在 UTL_file 上执行此操作的原因是因为在我们的生产服务器中,它需要 oracle 用户访问权限才能将写入的平面文件写入并将其移动到我们所需的目录中。另外一个问题是提取后仍然需要进行大量文本操作,我认为这是 Perl 的工作。
我现在想做的是编写自己的 DBI::Iterator 实现以及它可能需要的所有其他依赖项;不过要清楚,不一定都是。 (像一些只有 DBI 的方法,然后只是 idb_rows...只是为了让它运行,因为我无法安装模块)
原问题:
美好的一天, 我对 perl 编程比较陌生,一周前我开始在 perl 中再次收到内存不足的消息。我之前可以通过切换到 64 位 perl 来解决这个问题。
我昨天刚刚发现我的生产机器的内核不允许我使用超过 4GB 的内存(在我的其他生产服务器中,我能够将大量数据加载到内存中)
这是我在生产服务器中的具体限制
- 我不允许安装 perl 的新模块
- 在某种程度上,我可以在本地安装它们,但我遇到了问题
我现在打算做的是重新创建这个模块。 Iterator::DBI
我没有迭代器的背景。很长时间以来,我通过以下函数开发数据库提取和 ETL 流程。使用下面的函数一年半后,我第一次遇到内存不足的错误。
sub myDBI
{
my ($filename) = @_;
my $query = "";
unless(open(FILE,$filename))
{
Logger("[ ERR ] unable to open $SETTINGS{SQL_TRIGGER}\n");
print
die;
}
my @result=`sqlplus -S $SETTINGS{USER_NAME}/$SETTINGS{PASSWORD}\@$SETTINGS{DB_NAME} <<END
SET HEADING OFF
SET FEEDBACK OFF
SET SERVEROUTPUT ON
SET LINES 5000
SET COLSEP "||"
$query
/
`
;
@result;
}
【问题讨论】:
-
您似乎没有真正提出问题。你看到了什么行为?您希望看到什么行为?开放式设计问题不是堆栈溢出的目的。
-
您好,感谢您的建议,我更新了我的问题。我希望能够实现我自己的 idb_rows 版本,它是 DBI::Iterator 中的一个函数,仅仅是因为我不允许在我的生产服务器中安装模块。我上面发布的代码在我的新服务器中不起作用,因为我的内存不足。这将是我第一次处理 perl 迭代器。再次提前感谢。