[英]perl script to create xml from mysql query - out of memory
我需要從數據庫記錄中生成一個XML文件,並且出現錯誤“內存不足”。 這是我正在使用的腳本,可以在Google上找到它,但它不適合我,它還會殺死服務器分配的內存。 不過這是一個開始。
#!/usr/bin/perl
use warnings;
use strict;
use XML::Simple;
use DBI;
my $dbh = DBI->connect('DBI:mysql:db_name;host=host_address','db_user','db_pass')
or die DBI->errstr;
# Get an array of hashes
my $recs = $dbh->selectall_arrayref('SELECT * FROM my_table',{ Columns => {} });
# Convert to XML where each hash element becomes an XML element
my $xml = XMLout( {record => $recs}, NoAttr => 1 );
print $xml;
$dbh->disconnect;
該腳本僅打印記錄,因為我對單個行ID的where子句進行了測試。
首先,我無法使輸出保存到file.xml。
其次,我需要以某種方式將“作業”拆分為多個作業,然后將XML文件全部組合在一起。
我不知道如何實現兩者。
約束:無法訪問更改服務器設置。
這些是問題線:
my $recs = $dbh->selectall_arrayref('SELECT * FROM my_table',{ Columns => {} });
這會將整個表讀入內存,將每一行表示為值的數組。
my $xml = XMLout( {record => $recs}, NoAttr => 1 );
這可能甚至是更大的結構,它是一個完整的XML字符串。
內存使用率最低的解決方案需要涉及一次將表加載一項,並立即打印出該項。 在DBI中,可以進行查詢,以便一次循環獲取一行。
在結果看起來像預期的輸出之前,您將需要使用它(我沒有嘗試匹配XML::Simple
輸出-我將其留給您:
print "<records>\n";
my $sth = $dbh->prepare('SELECT * FROM my_table');
$sth->execute;
while ( my $row = $sth->fetchrow_arrayref ) {
# Convert db row to XML row
print XMLout( {row => $row}, NoAttr => 1 ),"\n";
}
print "</records>\n";
Perl可以使用open( FILEHANDLE, mode, filename )
開始訪問文件並print FILEHANDLE $string
以打印到文件,或者您可以調用腳本並將其通過管道傳輸到文件,例如perl myscript.pl > table.xml
沒有約束的選擇*會殺死您的記憶。 在查詢中添加一些約束,即日期或ID,並使用循環執行查詢並按塊進行輸出。 這樣,您就無需在輸出中開始之前就將整個表加載到mem中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.