Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1540to1544
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

400'000 Z, 60 S effizient auswerten

400'000 Z, 60 S effizient auswerten
14.02.2017 14:26:39
Dome
Hi Leute,
Ich stehe vor einem 400'000 Zeilen und 60 Spalten grossen Problem.
Ich ziehe mir aus einer DB via SAS Daten in ein .txt-File, importiere das in .xlsx und lege es ab.
Aus einem anderen .xlsx-File lese ich mir via VBA-Makro (zu lange um hier zu posten, inkl. Policy) die Daten aus dem erstgenannten File aus und befülle eine mächtige Tabelle mit Werten.
Das ging ja alles noch, als die Dateien noch 5-10MB gross waren (ca. 15Min. Rechenzeit). Jetzt geht es aber um 80MB. Hilfe...
Bevor ich den Code anonymisiere und Teile davon hier poste würde mich sehr interessieren ob es nicht effiziente Alternativen gäbe? Pivot? (leider habe ich einiges an Abhängigkeiten, welche für Pivots vermutlich auch zu aufwändig wären)
Ich Danke Euch für Eure Gedanken dazu.
Beste Grüsse,
Dome

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 14:44:52
harry
Hallo Dome,
schau Dir mal Power-Pivot an
Grüße
harry
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 15:03:27
Zwenn
Hallo Dome,
es kommt sehr darauf an, was Du mit den Daten machen willst. Im Normalfall sind solche Datenmengen wesentlich besser mit einer Datenbankanwendung zu verarbeiten. Wir arbeiten z.B. mit dem Ermittlungssystem Analyst's Workstation von IBM. Dazu gehört eine Datenbankanwendung (iBase), ein Visualisierungs Programm (Analyst's Notebook) und ein Data Mining Programm (Dataminer).
Aber selbst diese Werkzeuge stoßen manchmal an ihre Grenzen. In der Regel dann, wenn mit den Daten noch Zwischenrechnungen gemacht werden müssen. Dann nehme ich auch Excel zur Hilfe. Mit 15 Minuten Rechenzeit bist Du nach meiner Erfahrung bei Deiner Datenmenge schon ganz gut unterwegs. Selbst mit der Erweiterten Menge ist es noch im Rahmen, wenn Du 2 h auf die Rechnungen warten musst. Für eine Datenbank bräuchtest Du übrigens auch erstmal ein passendes Datenmodell.
Von der Dateigröße her (80 MB), ist das auf einer modernen Maschine absolut kein Problem. Ich nehme zwar an, dass das die Größe der xlsx auf der Festplatte ist, aber auch im Arbeitsspeicher zusammen mit Excel selbst ist da noch Luft nach oben. Die Frage ist, wieviele Zeilen hatten die 5 - 10 MB und wieviele werden es am Ende sein? Ist das ein einmaliges Projekt oder müssen die Berechnungen immer wieder mit immer mehr Daten durchgeführt werden?
Das xlsx Format komprimiert die in einer Datei liegenden Daten mit dem Algorithmus, den auch ZIP verwendet. Das kannst Du einfach sehen, wenn Du eine xlsx Datei mit der Endung .zip erweiterst. Du kannst dann reingucken und sie auch entpacken, wie jedes andere ZIP-Archiv auch. Du kannst also von der reinen Dateigröße her nicht auf die Verarbeitungsgeschwindigkeit schließen.
Damit jemand mehr zu Deinem Problem sagen kann wäre es hilfreich, wenn Du Deine Daten wenigstens beschreiben könntest und dazu schreibst, was Du mit ihnen machen willst. Also was brauchst Du für Ergebnisse? Welche Formeln verwendest Du? Am Ende wirst Du bei reinen Berechnungen ja nur Zeit sparen können, wenn die verwendeten Formeln sich noch optimieren lassen.
Viele Grüße,
Zwenn
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 15:11:55
Daniel
Hi
bei den Datenmengen, speichere als xlsb.
das ist das Originäre Excelformat, benötigt den wenigsten Speicherplatz und wird auch am schnellsten genöffnet.
ansonsten hängt es immer davon ab, was du konkret machen willst.
in Excel ist es beispielsweise oft hilfreich, die Daten so zu sortieren, dass alle Daten, die bearbeitet werden müssen, einen lückenlos zusammenhängenden Block bilden, so dass diese in einem Schritt bearbeitet werden können.
Beispielsweise dauert das Löschen der Zeilen 1 und 3 doppelt so lange wie das Löschen einer Zeile.
das Löschen eines Blockes ohne Lücken dauert immer so lange wie das Löschen einer Zeile, unabhängig davon, wieviele Zeilen der Block hat.
Gruß Daniel
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 15:27:18
Dome
Hi Leute,
Erstmal vielen lieben Dank für Eure Gedanken.
@harry: Ein solches Add-In ist bei unserer IT-Policy leider nicht möglich, ausserdem arbeite ich "noch" mit der Excel-Version 2007.
@Zwenn/Daniel:

Die Frage ist, wieviele Zeilen hatten die 5 - 10 MB und wieviele werden es am Ende sein? Ist das ein einmaliges Projekt oder müssen die Berechnungen immer wieder mit immer mehr Daten durchgeführt werden?

Vorhin arbeitete ich mit ca. 50'000 Zeilen.
Was möchte ich überhaupt und wie sieht mein Code aus?
Im Grundsatz eigentlich recht simpel: Eine Liste mit Verträgen (A:A) mit verschiedensten Bausteinen (B:B)(ein Vertrag kann auch mehrere Bausteine enthalten) und Eigenschaften in den Folgespalten (C:C ff.). Das ist die Quelldatei.
Der Code befindet sich in der Output-Datei und liest von dort die Daten aus der Quelldatei aus.
Ich habe eine Liste mit Bausteinen (um die Namen zu vergleichen) in der ersten Spalte. Der Code vergleicht nun Baustein für Baustein (in Output- und Quelldatei) und gibt mir die Anzahl Bausteine pro Vertrag und deren Eigenschaften zurück. Er geht in der Quelldatei also Zeile für Zeile durch.
Diese Auswertung generiere ich einmal pro Monat, also regelmässig.
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 15:38:33
Dome
um einen kleinen Eindruck zu erhalten...

Sub Datei_oeffnen()
Dim sPfad As String
Workbooks.Open (ThisWorkbook.Worksheets("Intro").Range("I16").Value)
WbDatei1 = ThisWorkbook.Worksheets("Intro").Range("I17").Value
Call Clean
End Sub
Sub Clean()
' Erst putzen und dann arbeiten
With..
End With
Call Analyse
End Sub
Sub Analyse
WbDatei1 = ThisWorkbook.Worksheets("Intro").Range("I17").Value
l_T = ThisWorkbook.Worksheets("Analyse").Cells(Rows.Count, 2).End(xlUp).Row
l_B = Workbooks(WbDatei1).Worksheets("Quelle").Cells(Rows.Count, 2).End(xlUp).Row
' Alles Null setzen
For i = 5 To l_T Step 1
s_b = ThisWorkbook.Worksheets("Analyse").Cells(i, 2).Value
For s = 3 To l_B
If Workbooks(WbDatei1).Worksheets("Quelle").Cells(s, 16).Value = s_b Then
If Workbooks(WbDatei1).Worksheets("Quelle").Cells(s, 2).Value = Bausteinnr Then
Else
Baustein = Baustein + 1
'das geht dann für alle Eigenschaften so weiter...
End If
Next s
' Speichern der Werte
ThisWorkbook.Worksheets("Analyse").Cells(i, 9).Value = E_1         ' Anzahl Tarife
ThisWorkbook.Worksheets("Analyse").Cells(i, 10).Value = E_2     ' Anzahl innerhalb Säule 3b
ThisWorkbook.Worksheets("Analyse").Cells(i, 11).Value = E_3
usw...

Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 16:07:18
Daniel
Hi
kannst du mal ne kleine Beispieldatei erstellen (Ausgangsdaten, Wunschergebnis)
sieht für mich aus, als ließe sich das über das Dictionary-Objekt lösen.
Gruß Daniel
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 16:46:27
Dome
Hi Daniel,
Braucht etwas Zeit, das ganze zu anonymisieren.
Werde mich diesbezüglich (vermutlich erst) morgen Mittwoch melden können.
Grüsse,
Dome
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 16:56:39
Daniel
HI
es muss nicht die vollständige Datei sein.
20 Zeilen sollten reichen, man muss erkennen, wie es aufgebaut ist.
Gruß Daniel
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 17:45:13
Daniel
HI
und was ist das Ergebnis für dieses Beispiel?
was genau soll in welcher Spalte gezählt werden, dh wo finde ich bspw die "Anzahl P mit 2 Personen"?
gruß Daniel
Quelle & Output
16.02.2017 12:01:45
Dome
Hi Daniel,
Hab versucht, das etwas verständlicher zu machen. (z.T. vermutlich immer noch nicht ganz klar)
Aber wenn ich Deine Gedanken, Dein Vorgehen verstehen kann, kann ich das dann auch für den Rest umsetzen.
https://www.herber.de/bbs/user/111515.xls
https://www.herber.de/bbs/user/111516.xls
Beste Grüsse,
Dominik
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 16:29:05
Luschi
Hallo Dome,
ist denn für die Datenhaltung selbst Access eine Alternative, um dann per Abfrage nur die gesünschten (gefilterten) Daten per SQL-Abfrage nach Excel zu holen, um dann mit Pivot zu arbeiten.
Aber es ist schon traurig, wie euch die IT-Abteilung und die Chefs im Regen stehen kassen, anstatt mal bischen Geld für neuere Software-Produkte auszugeben.
Ich hoffe doch, daß Dein PC nicht auch nur die Mindestaussttung hat (Pentium 4, 2 GB RAM)
Ich habe gerade vorige Wochen in Power-Pivot mit 2 Datentabellen ( aus SQL-Server mit je3,5 Mio. Datensätzen) und einer Verknüpfungs-Textdatei (1,2 Mio. Datenzeilen) gerbeitet und hatte kaine Probleme, die Pivottabelle rasch zu erstellen und in vernüftiger Zeit Datenfilter zu realisieren.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: 400'000 Z, 60 S effizient auswerten
14.02.2017 16:06:23
fcs
Hallo Dome,
bei der Verarbeitung so großer Datenmenge via VBA ist meistens die Übernahme/Verarbeitung der Daten in Datenarrays sinnvoll, wobei hier ggf. die Größe der erforderlichen Matrix Grenzen setzt.
Ich konnte bei einem neu gestarteten Excel 2010 unter Windows Vistea alle Daten einer Matrix mit 400000 Zeilen und 60 Spalten in ein Datenarray einlesen und verarbeiten.
Einfache Summierungen nach bis zu 4 Kriterien benötigen da nur wenige Sekunden
Pivot-Tabellenberichte
sind effizient nutzbar, wenn die Datenbasis passt und für Auswertung die integrierten Funktionen ausreichend sind.
Mit meinem schon etwas betagten Notebook (Windows Vista mit Excel 2010) bin ich bei der Datenmenge (ca. 140 MB wenn alle Zellen in der Matrix 400000 Zeilen/60 Spalten mit Werten gefüllt sind) allerdings manchmal an fehlenden Resourcen (welche auch immer) gescheitert.
Hier sollte man unbedingt für den Pivotbericht die Option "Daten --&gt Quelldaten mit Datei speichern" deaktivieren bevor man beginnt im Pivot-Layout Felder zu plazieren. Andernfalls wird die Größe der Datei exessiv aufgebläht.
Ansonsten sind Pivotauswertungen auch bei dieser Datenmenge imer noch superschnell.
LG
Franz
Anzeige
Ist schon knapp
14.02.2017 18:25:30
lupo1

Sub t()
A = [A1:AE1048576] 'klappt, 2 Sekunden
A = [A1:AE1048576] 'nicht genug Speicher (Surface Pro 4, 4 GB, Win10, Excel 2010 frisch)
End Sub
sind ca. nur 25% mehr als 400000 x 60. Außerdem waren meine Zellen leer.
richtig: Speicher voll bei A = [A1:AF1048576] owT
14.02.2017 18:26:43
lupo1

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige