WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Funktion XLSWRITE1 in parfor

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2021, 12:41     Titel: Funktion XLSWRITE1 in parfor
  Antworten mit Zitat      
Hallo zusammen,

ich verwende zum Schreiben mehrer Daten in eine Exceldatei die Funktion XLSWRITE1 (https://www.mathworks.com/matlabcen.....eexchange/10465-xlswrite1).
Leider muss ich nicht nur in eine Exceldatei schreiben, sondern in ca. 300 Stück.

Mit einer for-Schleife funktioniert alles wie es soll.
Nun möchte ich eine parfor Schleife verwenden, um den Prozess massiv zu beschleunigen, da die Exceldateien sehr groß sind und viel Zeit zum Öffnen und Schließen benötigen.
In jede einzelne Exceldatei können die Daten unabhängig von einander geschrieben werden, sodass nicht zeitgleich in eine Exceldatei geschrieben wird.

Beim Verwenden der parfor-Schleife kommen Fehlermeldungen wie die Variable Excel ist nicht verfügbar. Eine Änderung des Befehls 'basic' zu caller hilft nicht.
Der Compiler rät zu parallel.pool.Constant(...) - hilft auch nicht.
Auch dieser Befehel poolobj = gcp;
addAttachedFiles(poolobj,{'myFun1.m','myFun2.m'})
führt nicht zum Ergebnis.

Was mache ich falsch? Wie bereits erwähnt funktioniert die for-Schleife, aber nicht die parfor-Schleife. XLSREAD in parfor zu verwenden funktioniert. Hier wird aber der originale Befehl von Matlab verwendet.

Beste Grüße und vielen Dank
Jame Smile


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2021, 13:03     Titel:
  Antworten mit Zitat      
Hallo,

welches Release verwendest du denn?
In modernen MATLAB-Releases ist es oft nicht mehr notwendig, xlswrite1 zu verwenden.
Früher war es so, dass bei jedem xlswrite-Befehl ein Excel-Prozess geöffnet und wieder geschlossen wurde. Das ist nicht mehr der Fall.
Interessant ist der xlswrite1-Ansatz nur noch, wenn mehrfach in ein Blatt oder in mehrere Blätter einer Datei geschrieben werden muss. Falls mehrfach in ein Blatt geschrieben werden muss, würde ich erst mal alles versuchen, das in einen Schreibbefehl zu kombinieren. Dann bleibt als Hauptanwendungsfall das Schreiben in mehrere Tabellenblätter.

Wenn du xlswrite1 mit parfor verwenden willst, wird jeder Worker-Prozess seinen eigenen Excel-Prozess (mit actxserver) brauchen. Ich würde es dazu mit spmd versuchen.

Zitat:
Beim Verwenden der parfor-Schleife kommen Fehlermeldungen wie die Variable Excel ist nicht verfügbar.

Bitte Fehlermeldungen im Original posten, inkl. der Zeilen, die sie werfen.

Zitat:
Eine Änderung des Befehls 'basic' zu caller hilft nicht.

Wo machst du diese Änderung? Wie ändert sich das verhalten?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2021, 14:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

das ging aber schnell^^
Ich verwende MAtlab 2017b.
Ab welcher Version ist es nicht mehr notwendig xlswrite1 zu verwenden?
Also ist wird bei mir mehrfach und in mehrere Exceldateien geschrieben.
Deinen Vorschlag in einen Schreibbefehl zu verwenden, habe ich direkt bei der Programmierung verwendet (Tabellen aneinander hängen und einfügen). Allerdings sollen unterschiedliche Zeilen markiert werden, wofür immer ein Befehl verwendet werden muss.
Wie würde der code für spmd aussehen? alles wie bei parfor außer if worker == 1 then...
Die exakten Fehlermeldungen werde ich noch posten. Der PC ist im Moment beschäftigt.
Die Änderung von basic zu caller mache ich in der 2. Zeile der Funktion XLSWRITE1, weil diese Änerderung bei manchen Problemen helfen soll. Ich habe den Eindruck, dass genau diese Zeile mein Problem für die parfor-Schleife ist.
Auch hier werde ich ebenfalls die Änderung posten.

Beste Grüße
Jame
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2021, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ab welcher Version ist es nicht mehr notwendig xlswrite1 zu verwenden?

Müsste ich nachsehen / ausprobieren. Teste es doch mal in "deinem" Release:
* Öffne den Task Manager
* starte MATLAB neu
* verwende xlswrite mit einer großen Matrix. -> im Task Manager siehst du, dass ein Excel-Prozess geöffnet wird
Was passiert nach Abschluss des xlswrite-Befehls im Task Manager? Falls der Excel-Prozess wieder geschlossen wird, ist es das alte Verhalten, falls er bleibt, das neue. Das neue Verhalten ist besser, da dieser Excel-Prozess für weitere xlsread/xlswrite-Befehle zur Verfügung steht.

Zitat:
Wie würde der code für spmd aussehen?

Mir wird gerade bewusst, dass spmd wohl nicht die beste Lösung ist. Schau dir lieber mal das an:
https://de.mathworks.com/matlabcent.....m-server-handle-in-parfor

Zitat:
Allerdings sollen unterschiedliche Zeilen markiert werden, wofür immer ein Befehl verwendet werden muss.

"markiert" im Sinne einer Formatierung der Zellen in Excel? Machst du das über ActiveX? Hat aber dann nur am Rande mit xlswrite1 zu tun, oder?

Zitat:
Die Änderung von basic zu caller mache ich in der 2. Zeile der Funktion XLSWRITE1

evalin ist so oder so ziemlich gruselig. Im Zusammenhang mit parfor wird es sicher nicht besser.
Die Variable Excel sollte ein zusätzliches Eingabeargument sein und von außen übergeben werden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2021, 14:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich kann mich nun voll und ganz auf dieses Problem konzentrieren. Inzwischen habe ich es hinbekommen in einer parfor Schleife eine SQL Datenverbindung zu nutzen. Das beschleunigt das Programm massiv.

Jetzt wollte ich mich mit dem Excelproblem beschäftigen.
Es ist so, dass der Server beim Schreiben der Exceldateien 4000 s mit einem 8 Kern-Prozessor (HDD-Festplatte) benötigt und der "normale" PC mit SSD Festplatte 2000 s.
Für die Prozesse, die vorher abgearbeitet werden, nutze ich die Kerne sehr gut aus. Allerdings wie bereits erwähnt, werden die Daten in Excel einzeln geschrieben. Hier möchte ich die Kerne ebenfalls voll ausnutzen.
Dafür habe ich mir ein kleines Programm geschrieben, das prinzipiell identisch läuft und die Zeiten gemessen.
Das Programm öffnet 4 Exceldateien und schreibt in der Schleife 2 Befehle in jeweils unabhängige Exceldateien.
for k=1:2
xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','B3:G3');
xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','H3:M3');
end
Eine Exceldatei ist ca. 6 MB groß und benötigt zum Öffnen und Schließen ca. 10 s:
1. klassische for-Schleife mit xlswrite von Matlab --> 74.414178 seconds ( 8 x 10 s = 80 s)
2. einfach als parfor umgewandelt --> 26.554398 seconds ( weniger^^)
3. xlswrite1 genutzt --> 39.069315 seconds ( 4 x 10 s = 40 s)
4. xlswrite1 als pafor --> Error
Parfor von Matlab ist nur in diesem Beispiel Ideal, weil in eine Exceldatei nur mit 2 Befehlen geschrieben wird. Muss ich aber mehrere Spalten in ein Sheet eintragen und dies wiederum auch in andere Sheets ist xlswreite1 als parfor am schnellsten.
>> Test_read_Excel
Analyzing and transferring files to the workers ...done.
Error using xlswrite1 (line 2)
An UndefinedFunction error was thrown on the workers for 'Excel'. This might be because the file containing 'Excel' is not accessible on the workers. Use
addAttachedFiles(pool, files) to specify the required files to be attached. See the documentation for 'parallel.Pool/addAttachedFiles' for more details.

Error in Test_read_Excel (line 11)
parfor k=1:length(Testpfade(1:end,1))

Caused by:
Error using evalin
Undefined function or variable 'Excel'.

Besten Dank für deine Hilfe!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2021, 14:50     Titel:
  Antworten mit Zitat      
ActiveX könnte eventuell das mit dem Workbook sein.

Denke auch, dass das mit Evalin zu tun hat.

Wenn xlswrite verwendet wird, bleibt nach dem Funktionsaufruf Excel als Instance vorhanden. Allerdings öffnet er es wieder bei einem neuen Befehl. Ich denke das ist genau das, was xlswrite1 nutzt.

Das Programm sieht für die oben vorgestellen Fälle ca. so aus...

Code:
Testpfade{1,1} = 'H:\Test1.xlsm';
Testpfade{2,1} = 'H:\Test2.xlsm';
Testpfade{3,1} = 'H:\Test3.xlsm';
Testpfade{4,1} = 'H:\Test4.xlsm';
Size{1,1} = 'B3:G3';
Size{2,1} = 'H3:M3';
for k=1:length(Testpfade(1:end,1))
    Testdaten = {[9999, 9999, 9999, 9999, 9999, 9999]};
    % Excel öffnen
    Excel = actxserver('excel.application');
    File=char(Testpfade{k,1});
    if ~exist(File,'file')
        ExcelWorkbook = Excel.workbooks.Add;
        ExcelWorkbook.SaveAs(File,1);
        ExcelWorkbook.Close(false);
    end
    invoke(Excel.Workbooks,'Open',File);
    WB = Excel.Workbooks.Open(Testpfade{k,1});
   
    % Daten in Excel eintragen
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','B3:G3');
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','H3:M3');
   
    %Schließen und speichern
    invoke(Excel.ActiveWorkbook,'Save');
    Excel.Quit
    Excel.delete
end


[EDITED, Jan, Bitte code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.01.2021, 17:01     Titel:
  Antworten mit Zitat      
Hallo,

bitte verwende die Code-Umgebung. Das erhöht die Lesbarkeit der Beiträge sehr.

Hast du dir die Vorschläge mal genauer angesehen?

1.
https://de.mathworks.com/matlabcent.....m-server-handle-in-parfor

2.
Zitat:
evalin ist so oder so ziemlich gruselig. Im Zusammenhang mit parfor wird es sicher nicht besser. Die Variable Excel sollte ein zusätzliches Eingabeargument sein und von außen übergeben werden.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2021, 17:35     Titel:
  Antworten mit Zitat      
Was meinst du genau mit Codeumgebung?
Ja genau ist etwas unleserlich, aber ich weiß noch nicht wie ich es besser hinbekomme.

Zu Punkt 2:
Hier weiß ich nicht genau, was du meinst. Ich verwende den Orginalcode xlswrite1.

Zu Punkt 1:
Das hatte cih auch schon probiert gehabt.
Code:
Testpfade{1,1} = 'H:\Test1.xlsm';
Testpfade{2,1} = 'H:\Test2.xlsm';
Testpfade{3,1} = 'H:\Test3.xlsm';
Testpfade{4,1} = 'H:\Test4.xlsm';
Size{1,1} = 'B3:G3';
Size{2,1} = 'H3:M3';

Excel_parfor = parallel.pool.Constant(@() actxserver('excel.application'));
parfor k=1:length(Testpfade(1:end,1))
    Testdaten = {[9999, 9999, 9999, 9999, 9999, 9999]};
    % Excel öffnen
    Excel = Excel_parfor.Value;
    File=char(Testpfade{k,1});
    if ~exist(File,'file')
        ExcelWorkbook = Excel.workbooks.Add;
        ExcelWorkbook.SaveAs(File,1);
        ExcelWorkbook.Close(false);
    end
    invoke(Excel.Workbooks,'Open',File);
    WB = Excel.Workbooks.Open(Testpfade{k,1});
   
    % Daten in Excel eintragen
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','B3:G3');
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','H3:M3');
   
    %Schließen und speichern
    invoke(Excel.ActiveWorkbook,'Save');
    Excel.Quit
    Excel.delete
end


Leider kommt hier die Fehlermeldung.

>> Test_read_Excel
Analyzing and transferring files to the workers ...done.
Error using xlswrite1 (line 2)
An UndefinedFunction error was thrown on the workers for 'Excel'. This might be because the file containing 'Excel' is not accessible on the workers. Use
addAttachedFiles(pool, files) to specify the required files to be attached. See the documentation for 'parallel.Pool/addAttachedFiles' for more details.

Error in Test_read_Excel (line 10)
parfor k=1:length(Testpfade(1:end,1))

Caused by:
Error using evalin
Undefined function or variable 'Excel'.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.01.2021, 18:55     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was meinst du genau mit Codeumgebung?
Ja genau ist etwas unleserlich, aber ich weiß noch nicht wie ich es besser hinbekomme.

Ich meine genau das, was du in deinem letzten Beitrag jetzt verwendet hast. :)

Zitat:
Zu Punkt 2:
Hier weiß ich nicht genau, was du meinst. Ich verwende den Orginalcode xlswrite1

... und den Originalcode zu verwenden halte ich spätestens im Zusammenhang mit parfor für keine gute Idee. Ich würde das evalin weglassen und die Variable Excel als Argument übergeben.

Zitat:
Zu Punkt 1:
Das hatte cih auch schon probiert gehabt.

Mir geht es speziell um den Vorschlag von WorkerObjWrapper. Den sehe ich hier noch nicht.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2021, 19:19     Titel:
  Antworten mit Zitat      
Zitat:

... und den Originalcode zu verwenden halte ich spätestens im Zusammenhang mit parfor für keine gute Idee. Ich würde das evalin weglassen und die Variable Excel als Argument übergeben.

Wie würde das aussehen? Ich habe da auch schon etwas probiert. Vllt mache ich etwas falsch. Wie muss ich die xlswrite1 Funktion ändern?
Code:

function xlswrite1(file,data,sheet,range)
Excel=evalin('base','Excel');


Zitat:

Mir geht es speziell um den Vorschlag von WorkerObjWrapper. Den sehe ich hier noch nicht.

Dann weiß ich nicht, was du meinst.

Schon Mal einen guten Abend Smile

Grüße,
Harald[/quote]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.01.2021, 22:30     Titel:
  Antworten mit Zitat      
Hallo,

bitte doch ein bisschen selbständig arbeiten und die Vorschläge versuchen umzusetzen.
Code:
function xlswrite1(file,data,sheet,range, Excel)

und den Aufruf der Funktion entsprechend.

Zitat:
Dann weiß ich nicht, was du meinst.

Was ich mit... WorkerObjWrapper meine? Dann kann ich nur empfehlen, den Link genau zu lesen. Dort steht wie man an WorkerObjWrapper herankommt und damit arbeitet. Ich habe selbst noch nicht damit gearbeitet und müsste es auch erst ausprobieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2021, 12:04     Titel:
  Antworten mit Zitat      
Guten Morgen Harald,

Zitat:
bitte doch ein bisschen selbständig arbeiten und die Vorschläge versuchen umzusetzen.

Das mache ich natürlich immer! Dadurch, weil ich es schon Mal probiert hatte, dachte ich, dass ich etwas falsch mache. Jetzt habe ich mir nochmal ein kleines Modell wie folgt aufgebaut:

Code:
clear;
Testpfade{1,1} = 'H:\Test1.xlsm';
Testpfade{2,1} = 'H:\Test2.xlsm';
Testpfade{3,1} = 'H:\Test3.xlsm';
Testpfade{4,1} = 'H:\Test4.xlsm';
Size{1,1} = 'B3:G3';
Size{2,1} = 'H3:M3';

Excel_parfor = parallel.pool.Constant(@() actxserver('excel.application'));
parfor k=1:length(Testpfade(1:end,1))
    Testdaten = {[1111, 1111, 1111, 1111, 1111, 1111]};
    % Excel öffnen
    Excel = Excel_parfor.Value;
    File=char(Testpfade{k,1});
    if ~exist(File,'file')
        ExcelWorkbook = Excel.workbooks.Add;
        ExcelWorkbook.SaveAs(File,1);
        ExcelWorkbook.Close(false);
    end
    invoke(Excel.Workbooks,'Open',File);
    WB = Excel.Workbooks.Open(Testpfade{k,1});
   
    % Daten in Excel eintragen
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','B3:G3',Excel);
    xlswrite1(Testpfade{k,1},Testdaten{1,1},'G1 Messdaten','H3:M3',Excel);
    WB.Worksheets.Item(1).Range('B3:G3').Border.Item('xlEdgeTop').LineStyle = 1;
    WB.Worksheets.Item(1).Range('B3:G3').Border.Item('xlEdgeTop').Weight = 3;
    WB.Worksheets.Item(1).Range('B3:G3').Interior.Color = hex2dec('3EC1FF');
    WB.Worksheets.Item(1).Range('H3:M3').Border.Item('xlEdgeTop').LineStyle = 1;
    WB.Worksheets.Item(1).Range('H3:M3').Border.Item('xlEdgeTop').Weight = 3;
    WB.Worksheets.Item(1).Range('H3:M3').Interior.Color = hex2dec('3EC1F0');
   
    % Schließen und speichern
    invoke(Excel.ActiveWorkbook,'Save');
    Excel.Quit
    Excel.delete
end


Durch das übergeben der Variablen Excel an die Funktion XLSwrite1 und das Auskommentieren der Zeile 2 in XLSWrite1, kann ich jetzt parallel reinschreiben^^ Das ist schon Mal richtig gut! Allerdings hatte ich bereits wie erwähnt schon Mal diesen Weg ausprobiert, aber ohne Erfolg. Es ist auch klar warum...
Jetzt kommts:
1. offensichtlich ist es prinzipiell möglich parallel in Excel zu schreiben
2. Wende ich dieses Prinzip auf mein eigentliches Programm an, funktioniert es nicht und es erscheint eine verrückte Fehlermeldung.
3. Noch verrückter wird es, wenn ich in meinem eigentlich Programm zum Spaß nur eine Exceldatei auswerte, dann funktioniert es auch. Was ist hier los?!

Code:
Error using Chanlex (line 500)
An UndefinedFunction error was thrown on the workers for 'Workbooks'.  This might be because the file containing 'Workbooks' is not accessible on the workers.  Use
addAttachedFiles(pool, files) to specify the required files to be attached.  See the documentation for 'parallel.Pool/addAttachedFiles' for more details.

Caused by:
    Undefined function 'Workbooks' for input arguments of type 'handle.handle'.



Zitat:
Was ich mit... WorkerObjWrapper meine? Dann kann ich nur empfehlen, den Link genau zu lesen. Dort steht wie man an WorkerObjWrapper herankommt und damit arbeitet. Ich habe selbst noch nicht damit gearbeitet und müsste es auch erst ausprobieren.

Da komme ich bisher nicht weiter. Meinte gelesen zu haben das funktioniert bei älteren Versionen und bei neuen nutzt man "parallel.pool.Constant". Kann das sein? Dürfte das selbe sein oder?


Beste Grüße
Jame
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.01.2021, 15:13     Titel:
  Antworten mit Zitat      
Hallo,

ein nachvollziehbares Beispiel wäre hilfreich.

Du schreibst workbooks erst klein, dann mit großem W. Es wird also sehr wahrscheinlich nur eines von beiden funktionieren.

Zitat:
es erscheint eine verrückte Fehlermeldung.

Was ist an der Fehlermeldung verrückt?

Zitat:
wenn ich in meinem eigentlich Programm zum Spaß nur eine Exceldatei auswerte, dann funktioniert es auch

Was genau machst du da? Führst du das dann insbesondere innerhalb einer parfor-Schleife aus oder nicht?

Ein Kernproblem ist, dass bei parfor die Iterationen auf unterschiedlichen Prozessen ausgeführt werden.

Zitat:
Meinte gelesen zu haben das funktioniert bei älteren Versionen und bei neuen nutzt man "parallel.pool.Constant".

Wo denn?

Zitat:
Kann das sein? Dürfte das selbe sein oder?

Kann ich nicht sagen. Wenn es aber Probleme mit einem Ansatz gibt und ein anderer zur Verfügung steht, dann würde ich persönlich einfach mal den anderen Ansatz ausprobieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jame
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 20.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2021, 10:06     Titel:
  Antworten mit Zitat      
Guten Morgen Harald,

nach langem hin und her habe ich endlich den Fehler gefunden. Leider war es eine Summe aus einigen anderen Fehlern, warum ich nicht gleich direkt auf die Lösung gekommen bin.

Punkt 1 ist, dass die Funktion xlswrite an sich bei der Eingabe und vor allem bei der fehlerhaften Eingabe ein String verlangt, aber die Funktion tatsächlich ein Char benötigt. Ansonsten kommt es zu unschönen Fehlermeldungen wie Workbook oder anderes dergleichen.
Punkt 2 ist, dass beim Aufrufen einer parfor-Schleife "Excel" als Variable der Funktion xlswrite1 übergeben werden muss. Daher muss auch in diesem Zusammenhang in der Funktion xlswrite1 selbst die Zeile evalin Excel auskommentiert werden und stattdessen oben in der Definition der Funktion die "5" Variable eingefügt werden.
Punkt 3 ist, dass im eigentlichen Programmcode unbedingt auf die Zeile "Excel.delete" verzichtet werden muss, da ansonsten die Definition vor der parfor-Schleife "Excel_parfor = parallel.pool.Constant(@() actxserver('excel.application'));" ihre Gültigkeit verliert.
Punkt 4 ist, dass die Vorgehensweise auch eins zu eins für xlsread1 funktioniert.

Nun zu deinen Punkten...
Zitat:

Was ist an der Fehlermeldung verrückt?

Durch die Varianz des Indexs für die parfor-Schleife hat der Code willkürlich funktioniert (scheinbar). Es hängt tatsächlich von der Anzahl an Versuchen, die ausgewertet werden sollen ab, sowie wie viele Worker an der Schleife arbeiten. Ist die Zahl der zu auswertenden Versuchen größer als die Zahl der Worker, tritt eine Fehlermeldung auf, wenn Excel.delete nicht auskommentiert wird. Umgekehrt spielt es keine Rolle.

Jetzt läuft mein ganzes Hauptprogramm als parfor mit xlsread1 und xlswrite1. Smile
Somit konnte die Zeit von 4108 Sekunden auf 467 Sekunden (16 Cores) reduziert werden.

Nun habe ich noch zwei Probleme:
Durch die "5" Variable in xlsread1 bekomme ich die Warnung...
Code:
Warning: The fifth argument to XLSREAD must be a function handle.
> In xlsread1 (line 180)
  In parallel_function>make_general_channel/channel_general (line 917)
  In remoteParallelFunction (line 41)

Was muss ich hier ändern? Würde ungern die Warnung ignorieren. Die Funktion xlsread1 kann vermutlich unbegrenzt Eingangsgrößen annehmen?!

Während dem Schreiben der Messdaten in Excel erhalte ich Meldungen von Excel (siehe Anhang). Leider bleibt mein Programm stehen bis ein Mensch die Meldung quittiert. Wie kann ich die Meldung unterbinden?
Code:
Excel.DisplayAlerts = false;

hat leider nicht geholfen.

Beste Grüße
Jame

Excel.jpg
 Beschreibung:

Download
 Dateiname:  Excel.jpg
 Dateigröße:  36.75 KB
 Heruntergeladen:  200 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2021, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

schön, dass es nun soweit klappt. VBA ist leider Gefrickel, da hilft dann auch die "Fernsteuerung" aus MATLAB nicht.

Zu den noch bestehenden Problemen:

1.
Wo genau ist diese 5? Ich sehe den Sinn davon nicht.
Bitte genau angeben, wo du bei xlsread1 bzw. xlsread diese 5 einfügst, und bitte die kompletten Code-Zeilen hier rein kopieren.

2.
Das könnte helfen:
https://docs.microsoft.com/de-de/of.....fungen%20best%C3%A4tigen.

Alternativ habe ich hier den Eindruck, dass man AskToUpdateLinks setzen muss:
https://www.vb-paradise.de/index.ph.....MsgBox-unterdr%C3%BCcken/

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.