2013-03-12 51 views
1

以下是將SQL查詢轉儲爲對齊文本表格格式的代碼。使用Text :: Table性能格式化SQL查詢性能

sub sql_command { 
    my ($self,$str) = @_; 
    my $s = $self->{_db}->prepare($str) or die $!; 
    $s->execute() or die $!; 
    my $table; 
    push @$table, [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}]; 
    while(my $row = $s->fetch) { 
      push @$table, [ map{ defined $_ ? $_ : "undef" }@$row ]; 
    } 
    return box_format($table);; 
} 


sub box_format { 
    my $table = shift; 
    my $n_cols = scalar @{$table->[0]}; 

    my $tb = Text::Table->new(\'| ', '', (\' | ','')x($n_cols-1), \' |+'); 
    $tb->load(@$table); 
    my $rule = $tb->rule(qw/- +/); 
    my @rows = $tb->body(); 
    return $rule, shift @rows, $rule, @rows, $rule 
      if @rows; 
} 

輸出如預期。但是在性能方面,處理大約5MB大小的輸出文件需要大約30秒。

在性能方面是否有更好的方法來實現這一目標?

謝謝!

+0

在'while'循環和'box_format'中花了多少時間? – 2013-03-12 08:44:16

回答

2

該代碼有幾個可能的性能問題。首先,在構建$table時,您將整個數據集拉入內存。這會消耗大量的內存。數據出來後,格式化會更好。這意味着代替使用Text::Table->load,您可以使用Text::Table->add

sub sql_command { 
    my ($self,$sql) = @_; 
    my $sth = $self->{_db}->prepare($sql) or die $!; 
    $sth->execute() or die $!; 

    return box_format_from_query($sth); 
} 

sub box_format_from_query { 
    my $sth = shift; 
    my $headers = [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}]; 
    my $num_cols = @$headers; 

    my $table = Text::Table->new(\'| ', '', (\' | ','')x($num_cols-1), \' |+'); 
    while(my $row = $s->fetch) { 
      $table->add(map { defined $_ ? $_ : "undef" } @$row); 
    } 

    my $rule = $tb->rule(qw/- +/); 
    my @rows = $tb->body(); 
    return $rule, shift @rows, $rule, @rows, $rule 
      if @rows; 
} 

第二個性能問題可能是Text :: Table本身。由於表格方法在數據的副本上工作(也就是說,您沒有將數據作爲參考傳入),因此不太可能使用大數據集來編寫數據。唯一的方法是找出您的代碼。看看Devel::NYTProf。你應該能夠弄清楚你的代碼花費了多少時間。如果它發生在Text :: Table方法內部,則應聯繫作者或考慮另一種生成格式化輸出的方法。

第三個性能問題可能是您的查詢。你不顯示你的查詢,但它完全有可能是效率低下的。 Devel :: NYTProf會告訴你,你是否花了很多時間在$sth->execute。如果是這樣,你還有另一個問題要問。 :)

+0

謝謝。 1.加載數據線有一點幫助。好主意。 :) 2.查詢只是一個簡單的「從表中選擇*」。這不是瓶頸。 3. Text :: Table本身的確是問題。我會聯繫作者。你碰巧知道其他產生格式化輸出的方法嗎?再次,謝謝! – Mattan 2013-03-12 14:13:56

+1

@Mattan很高興你解決了它!對不起,我沒有做太多的數據格式。如果您提供了輸出格式的樣本,也許我們可以提供幫助,那麼確定Text :: Table可能產生的內容對我來說是不可思議的。而且,你猜對了,聽起來像是另一個問題! – Schwern 2013-03-12 21:57:48