Schrift
[thread]8902[/thread]

Spreadsheet::WriteExcel Spreadsheet::ParseExcel: Resourcenverwendung? (Seite 2)

Leser: 10


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
GoodFella
 2007-04-09 17:08
#75655 #75655
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
oops, sorry.... :)
Ja, hab ich wirklich übersehen... hab wohl irgendwie nicht damit gerechnet, dass hier noch so viel Reaktion kommt..
Stellt sich jetzt die Frage, wie ich es hinbekomme, die Datenstruktur genauso aufzubauen wie sie urgsprünglich ist - nur mit weniger Attributen im Hash..
Ausserdem:
Quote
CAUTION : The atributes of Workbook may not be complete. This function will be called almost order by rows and columns. Take care almost, not perfectly.

aus http://search.cpan.org/~szabgab/Spreadsheet-ParseExcel-0.30/lib/Spreadsheet/ParseExcel.pm

...soll ich das so verstehen, dass die Funktion bei Zelle[12,13] mit dem Wert Row=12, Col=16 aufgerufen wird oder dass die Parameter richtig sind und nur nicht in der richtigen Reihenfolge gefüllt wird?

Naja, danke euch beiden.
MisterL
 2007-04-09 20:59
#75656 #75656
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Wie kann man eigentlich auf solche Ideen kommen, wie oben gesehen ?
Ein Modulvorschlag zur Güte: CPAN:SimpleExcel (vom Meister persönlich)
Hack #21 aus 'Perl Hacks'
“Perl is the only language that looks the same before and after RSA encryption.”
GoodFella
 2007-04-09 21:02
#75657 #75657
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=MisterL,09.04.2007, 18:59]Wie kann man eigentlich auf solche Ideen kommen, wie oben gesehen ?
Ein Modulvorschlag zur Güte: CPAN:SimpleExcel (vom Meister persönlich)
Hack #21 aus 'Perl Hacks'[/quote]
SimpleExcel kennt nur Strings und Zahlen. Da ich auch andere Formate brauche, kann ich also nur WriteExcel benutzen.
[edit]
Mit SimpleExcel kann man nur schreiben, nicht lesen


Um es mal zu verdeutlichen, ich möchte:

1. Rohdaten einlesen.
2. Im Speicher Formate hinzufügen + Daten bearbeiten
3. Daten speichern.\n\n

<!--EDIT|GoodFella|1176138640-->
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
GoodFella
 2007-04-23 19:00
#75659 #75659
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Auch wenn niemand eine Idee hat .. könnte ich vielleicht nen Kommentar bekommen? Büdde büdde... :)
vayu
 2007-04-23 19:31
#75660 #75660
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ich hatte das Problem mal mit einer XML Datei ... der speicherverbrauch war enorm, weil die Datei immer komplett eingelesen habe.
Hab die XML Datei, dann halt stück für stück eingelesen und verarbeitet, dann konnte man gut mit dem script arbeiten.
GoodFella
 2007-04-23 19:55
#75661 #75661
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Wie hast du das gemacht, Stück für Stück? Mit ->ParseAbort?
Allerdings .. die Daten kommen ja nicht immer in der richtigen Reihenfolge .. s.o.


Achja nebenbei: Weitere Tests haben ergeben, dass sich der Speicherverbrauch jetzt wie folgt verhält:

Man liest eine Datei ein, Speicher wird alloziiert; entfernt man diese wieder, bleibt der Speicherverbrauch gleich. Fügt man jetzt allerdings eine neue Datei hinzu, dann bleibt der Speicherverbrauch _auch_ gleich, sofern die zweite Datei nicht grösser als die erste war, d.h. der "alte" Speicher wird überschrieben. ..Das ist natürlich eine extreme Verbesserung im Gegensatz zur alten Methode, wo der Speicherverbrauch immer mehr wurde. Allerdings wäre es natürlich schöner, wenn der Speicher sofort nach dem Entfernen freigegeben werden würde.\n\n

<!--EDIT|GoodFella|1177344075-->
vayu
 2007-04-23 20:38
#75662 #75662
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
wie gesagt, war ne xml datei -> anderes modul ^^ das hatte halt die möglichkeit alles stück für stück einzulesen.
GoodFella
 2007-04-23 22:14
#75663 #75663
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=vayu,23.04.2007, 18:38]wie gesagt, war ne xml datei -> anderes modul ^^ das hatte halt die möglichkeit alles stück für stück einzulesen.[/quote]
:/ ..trotzdem danke für Deinen Beitrag.
vayu
 2007-04-23 23:19
#75664 #75664
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
war halt nur ein ansatz, ich kenn das Excel modul nicht, aber hätt ja sein können, dass das irgendwie funktioniert. und du wolltest kommentare ^^
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2007-04-04 02:24.