簡體   English   中英

Perl腳本從mysql查詢創建xml-內存不足

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM