2013-03-30 60 views
2

我需要從數據庫記錄中生成XML文件,並且出現「內存不足」錯誤。這裏是我使用的腳本,它在谷歌上找到,但它不適合我,它也會殺死服務器分配的內存。儘管這是一個開始。perl腳本從mysql查詢創建xml - 內存不足

#!/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; 

此腳本僅打印記錄,因爲我使用where子句測試了單個行ID。

  • 首先,我無法設法將其輸出保存到file.xml中。其次,我需要以某種方式將多個作業中的「作業」拆分,然後將XML文件放在一起。

我不知道如何實現兩者。

約束:無權訪問更改服務器設置。

+0

喜,這並不似乎是bash的,但一個Perl腳本 – ajreal

回答

4

這些問題行:

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

+0

非常感謝你很多爲你的答案!它炒作,但它從數據庫中提出的所有細節...我需要噸o只有幾個,(id,姓名,用戶,電子郵件,電話,日期)。這將做的工作,「SELECT ID,名稱,用戶,電子郵件,電話,日期從MY_TABLE」,但現在它涉及到XML格式必須是這樣的 約翰 email @ domain。COM 123-123-1234 2013-01-01 ,如果你想具體的XML元素,我沒能輸出行到一個XML文件... – john

+0

,您將需要在他們的名字Perl以便XML :: Simple知道如何處理它們。你可以通過從你的數組中創建一個Perl哈希來實現。如果第一個db列是'id'和'name',那麼你可以從'my $ hashed_row = {user_id => $ row - > [0],user_first_name => $ row - > [1]}開始 - 我想從那裏你可以找出如何完成剩下的工作。你可能還有更多要做,但我認爲這應該讓你接近 –

0

這是選擇*沒有任何限制會殺死你的記憶。爲查詢添加一些約束條件,例如日期或id,並使用循環執行查詢並以塊爲單位執行輸出。這樣,在開始輸出之前,您不需要在mem中加載整個表。