Laden...

Bearbeitung mehrerer Dateien mittels Multithreading

Erstellt von skywalker123 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.721 Views
S
skywalker123 Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren
Bearbeitung mehrerer Dateien mittels Multithreading

Hallo Forum,
ich würde gerne wissen, wie ich diese Aufgabe elegant und threadsicher umsetzen kann. Im Detail geht es darum aus Exceldateien, die sich auf einem Netzlaufwerk befinden, bestimmte Informationen auszulesen. Werden die Exceldateien geöffnet, die Information ausgelesen, geschlossen und danach erst die nächste Datei geöffnet, so dauert der ganze Prozess sehr lange. Deshalb die Idee, zwei weitere Threads zu verwenden.

Thread 0
Erstellt Excel.Application für Thread 1 und Thread 2 und startet danach Thread 1 und Thread 2. Danach wartet Thread 0 bis beide Threads beendet sind.

Thread 1
Öffnet eine Exceldatei nach der anderen.

Thread 2
Prüft permanent, ob eine neue Exceldatei von Thread 1 (heruntergeladen und) geöffnet wurde. Ist dies der Fall werden die Informationen ausgelesen.

Ist das eine probate Möglichkeit dies umzusetzen? Wie ist es mit der Excel.Application: Kann Thread 0 diese erstellen und Thread 1 und Thread 2 diese ebenfalls verwenden? Was gilt sonst noch zu beachten?

Vielen Dank schon mal...

Gruß

16.842 Beiträge seit 2008
vor 9 Jahren

TPL Pipelines

Bin/Wär mir aber nicht sicher ob sich Excel auf diese Weise parallelisieren lässt.
Threading-Unterstützung in Office

Du solltest Dir zudem die Grundlagen der Tasks aneignen. Es schadet auch nicht zu wissen was der Unterschied von Tasks und Threads sind.
Threads direkt zu verwenden ist heut zu Tage nicht mehr das Maß alle Dinge (jedenfalls mit .NET); STA kann jedoch ein Grund sein, wieso es mit Tasks nicht geht. Umso vorsichtiger muss man mit Threads sein.

Es sei auch gleich gesagt, dass es nicht immer schneller ist, wenn man mit mehreren Tasks/Threads arbeitet.
Auf lokalen Festplatten kann sowas sogar massiv kontraproduktiv sein.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Als nächtes wäre auch noch abzuklären ob überhaupt Excel benötigt wird.

Man kann die Dateien ja meist auch ohne Umweg lesen und bearbeiten.

S
skywalker123 Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

vielen Dank schon mal für die Antworten. Ich wollte noch erwähnen, dass es sich um VSTO Code in einer Exceldatei handelt. Es wird also in einer Exceldatei A heraus andere Exceldateien geöffnet, geparst und die Ergebnisse in der Exceldatei A wiederum dargestellt.

S
skywalker123 Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Ich würde es gerne mit Threads mal versuchen, jedoch habe ich das Problem, dass wenn ich in meinem Hauptthread die Excelanwendung erzeuge und in meinem zweiten Thread diese verwende der Thread abbricht.

Muss ich das Objekt vorher, ähnlich wie bei der GUI mit PInvoke, synchronisieren?

F
10.010 Beiträge seit 2004
vor 9 Jahren

Kannst du nicht, da hier COM benutzt wird und das ist Singlethreaded.

Warum meinst du das innerhalb eines VSTO machen zu müsse?
Was passiert da das das nötig ist?

S
skywalker123 Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Die Entscheidung für Excel mit VSTO war naheliegend, da der Endanwender mit den Daten, die er wiederum aus anderen Exceldateien einliest, arbeiten möchte. Dafür eignet sich Excel ja recht gut.

Habe ich es richtig verstanden: Office nutzt COM und COM ist Singlethreaded was bedeutet, dass auf Officekomponenten nicht aus mehreren Threads zugegriffen werden kann?

Das Nadelöhr ist ja das herunterladen vom Netzlaufwerk der vielen Exceldateien. Wäre es denn möglich in jedem Thread eine eigene Excelanwendung zu starten und mit dieser eine Exceldatei zu öffnen und nach dem Öffnen in den Hauptthread zu überführen.

16.842 Beiträge seit 2008
vor 9 Jahren

Mit VSTO Addins kannste schon mehrere Tasks oder Threads verwenden; es ist aber heikler als in einer normalen Anwendung.
Aber die Regeln wie nur ein GUI Threads gelten hier genauso, was Dir die Arbeit mit Excel deutlich erschwert. Du kannst nur in einem Thread mit Excel arbeiten. Deine Vorstellung der Abfolge funktioniert also so erstmal nicht.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo skywalker123,

Das Nadelöhr ist ja das herunterladen vom Netzlaufwerk der vielen Exceldateien.

heutzutage ist der (Datentransfer-)Zugriff auf ein Netzlaufwerk im (10 GBit-LAN) nicht grundsätzlich spürbar langsamer als der Zugriff auf ein lokales Laufwerk. Ich verstehe auch den Begriff "Herunterladen" im Zusammenhang mit einem Netzlaufwerk nicht. Normalerweise erfolgt der Zugriff auf ein Netzlaufwerk vollkommen transparent also ununterscheidbar zu einem Zugriff auf ein lokales Laufwerk. Oder meinst du einen Cloud-Speicher. Wenn ja mit welcher Bandbreite ist der angebunden?

Wäre es denn möglich in jedem Thread eine eigene Excelanwendung zu starten und mit dieser eine Exceldatei zu öffnen ...

Das sollte gehen.

... und nach dem Öffnen in den Hauptthread zu überführen.

Das gerade nicht, aber das ist auch nicht notwendig. Es stört ja nicht bzw. ist ja gerade beabsichtigt, dass mehrere Threads an verschiedenen Excel-Dateien arbeiten. Natürlich ist es möglich im Haupt-Thread zu warten, bis alle Worker fertig sind.

herbivore

F
10.010 Beiträge seit 2004
vor 9 Jahren

Es ist aber eher die Frage ob Excel gestartet werden muss um die Daten zu extrahieren oder ob man das mit einer der vielen OfficeFile Bibliotheken machen kann.
OleDb kann z.b. Zahlenreihen extrahieren und benötigt nicht einmal ein installiertes Excel, und kann natürlich auch von VSTO benutzt werden.

S
skywalker123 Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

@FZelle
Danke für diesen interessanten Hinweis. Daran habe ich ehrlich gesagt nicht gedacht. Diesen Ansatz möchte ich gerne als zweiten Schritt verfolgen. Als erstes möchte ich den aktuellen noch etwas bestreiten, da die Funktion schon ausprogrammiert ist und es nur noch um die Performance geht.

@herbivore
Mit herunterladen meine ich, dass beim Öffnen der Exceldatei vom Server diese heruntergeladen in den Arbeitsspeicher des öffnenden PCs geladen werden muss. Bei einem 10GBit Lan macht es gewiss keinen Unterschied. Ich habe euch vorenthalten, dass auf die Exceldateien auf dem Server häufig über VPN zugegriffen wird und hierbei die Bandbreite sehr unterschiedlich und auch gering sein kann.

Du hast völlig recht, es reicht aus, dass ich Excelanwendung in den Threads starte. Ich stelle mir dann vor, dass ich eine globale Collection habe, wie z.B. eine Liste, die ich aus allen Threads befülle. Wie würde denn ein threadsicherer Zugriff verschiedenen Threads auf diese Collection aussehen?

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo skywalker123,

es gib viele verschiedene threadsichere Collections bzw. Wege threadsicher auf normale Collections zuzugreifen. Hier würde sich ab .NET 4.0 wohl BlockingCollection<T> anbieten bzw. vor .NET 4.0 SyncQueue <T> - Eine praktische Job-Queue.

Grundsätzlich gehört der threadsichere Zugriff auf Collections zu den Grundlagen (der Multitatsking-Programmierung). Bitte beachte insoferen [Hinweis] Wie poste ich richtig? Punkt 1.1.1. (und 1.1.). Siehe auch [Artikel] Multi-Threaded Programmierung.

herbivore