Thread Spreadsheet::WriteExcel Spreadsheet::ParseExcel: Resourcenverwendung? (21 answers)
Opened by GoodFella at 2007-04-04 02:24

GoodFella
 2007-04-23 02:55
#75658 #75658
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Ist schon etwas länger her; trotzdem bin ich jetzt endlich dazu gekommen, ein paar Tests diesbezüglich zu machen.

Da ich die Datenstruktur von Spreadsheet::ParseExcel in fast 5000 Zeile quer verteilt benutze, habe ich mir diejenigen Hash-Keys rausgesucht, deren Daten ich benötige und baue damit diese Datenstruktur nach; jedoch ohne Formate etc.

Hier mein Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $excel_handle = Spreadsheet::ParseExcel->new( CellHandler => \&get_cell_data, NotSetCell => 1 );
my $current_book = {};

sub get_cell_data
 {
  my ($book, $sheet, $row, $col, $cell) = @_;
  $current_book->{Worksheet}[$sheet]->{Cells}[$row][$col]->{Val} = $cell->{Val};
  $current_book->{Worksheet}[$sheet]->{MaxRow} = $row if (!(defined($current_book->{Worksheet}[$sheet]->{MaxRow})) or ($current_book->{Worksheet}[$sheet]->{MaxRow} < $row));
  $current_book->{Worksheet}[$sheet]->{MinRow} = $row if (!(defined($current_book->{Worksheet}[$sheet]->{MinRow})) or ($current_book->{Worksheet}[$sheet]->{MinRow} > $row));
  $current_book->{Worksheet}[$sheet]->{MaxCol} = $col if (!(defined($current_book->{Worksheet}[$sheet]->{MaxCol})) or ($current_book->{Worksheet}[$sheet]->{MaxCol} < $col));
  $current_book->{Worksheet}[$sheet]->{MinCol} = $col if (!(defined($current_book->{Worksheet}[$sheet]->{MinCol})) or ($current_book->{Worksheet}[$sheet]->{MinCol} > $col));
  $current_book->{Worksheet}[$sheet]->{Name} = $book->{Worksheet}[$sheet]->{Name} if (!(defined($current_book->{Worksheet}[$sheet]->{Name})));
  $current_book->{SheetCount} = ($sheet + 1) if (!(defined($current_book->{SheetCount})) or ($current_book->{SheetCount} < ($sheet + 1)));
 }

my $excel_book = $excel_handle->Parse('test_1.xls');
$excel_book = $current_book;


Meine Tests haben ergeben, dass eine Testdatei, die ohne CellHandler

390MB

Arbeitsspeicher verbraucht, nun nur noch

253MB

benötigt. Dies kommt mir trotzdem ein wenig viel vor, ich hatte mir mehr davon erwartet.
Die Testdatei hatte 47.000 Zeilen x 12 Spalten = 564000 Zelleninhalte. Wenn man das jetzt mal auf den Arbeitsspeicherverbrauch umrechnet (MaxCol etc. kann man ja vernachlässigen), dann kommt man auf ~470 Byte pro Zelle. In den Zellen stehen Strings von max ~200 - 300 Zeichen Länge, sehr viele davon viel weniger (sind Adressdaten), vielleicht könnte man das irgendwie begrenzen?
Freue mich über Ideen diesbezüglich..

Gruss

Pete

View full thread Spreadsheet::WriteExcel Spreadsheet::ParseExcel: Resourcenverwendung?