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

Log files > 2 GB mittels plot() darstellen

 

Mobman
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 03.08.2011, 15:48     Titel: Log files > 2 GB mittels plot() darstellen
  Antworten mit Zitat      
Hallo Leute,

ich Werte gerade sehr große Log files aus und lese die mittels folgendem Script ein:
Code:

clc;

input1 = 'log1.txt';
input2 = 'log2.txt';
input3 = 'log3.txt';

filename = input1;

fid = fopen(filename);

line = fgets(fid);
line = fgets(fid);
line = fgets(fid);

i = 1;
while ~feof(fid)
   
    line          = fgets(fid);
    [time, value] = strtok(line, ';');
    value         = strrep(value, ';', '');
   
    time  = str2double(time);
    value = str2double(value);
   
    time_array(end+1)  = time;
    value_array(end+1) = value;
   
    i = i + 1;
end;

fclose(fid);

plot(time_array, value_array);
 


Nun habe ich das Script vor ein paar Stunden ausgeführt und der Rechner ist immer noch nicht fertig.

1. Wisst ist ihr ob es überhaupt so möglich ist?
2. Gibt es einen Weg mit dem es schneller geht?

... und...

3. Ich habe zuvor mal den Import-Wizard von MATLAB getestet. Damit erhielt ich aber nur Fehlermeldungen bezüglich Arbeitsspeicher wäre ausgelastet. Wieso tritt das Problem hierbei (bisher) nicht auf?

Vielen Dank und lieben Gruß
mobman
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 03.08.2011, 16:10     Titel:
  Antworten mit Zitat      
Der Import Wizard versucht das File auf einen Schlag zu lesen und stellt fest, dass das unrealistisch ist.

Schleifen mit FGETS oder ähnlichen Befehlen finden vielleicht erst nach mehreren Stunden heraus, dass der Speicher voll ist.

Konkrete Hilfe kann die Community besser geben wenn die Struktur der Daten bekannt ist. Können wir ein Beispielfile sehen, z.B. die ersten 20 Zeilen?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Mobman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 03.08.2011, 16:17     Titel:
  Antworten mit Zitat      
Hallo Andreas,

achso, der Import-Wizard checkt das quasi vorher schon einmal ab, okay.
Wobei mich wundert, dass die RAM Auslastung von MATLAB nicht zunimmt, während beim Import-Wizard sofort der Speicher voll ist.

Klar, hier ein Beispiel:
Code:

888.161775;;;;;;;;;;;;;;;;;;;;;;;3184085;
888.161775;;;;;;;;;;;;;;;;;;;;;;3.18408;
888.161875;;;;;;;;;;;;;;;;;;;;;;;3846133;
888.161875;;;;;;;;;;;;;;;;;;;;;;3.84613;
888.161975;;;;;;;;;;;;;;;;;;;;;;;3013527;
 


Diese Zeilen wiederholen sich unzählige Male bis die insgesamt 4,7 GB - gesplittet in drei gleich große Dateien - fertig sind.

Danke
mobman
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.08.2011, 00:18     Titel: Re: Log files > 2 GB mittels plot() darstellen
  Antworten mit Zitat      
Hallo Mobman,

Code:

    time_array(end+1)  = time;
    value_array(end+1) = value;
 

Dies ist ein ernstes Problem. Die Vektoren wachsen in jeder Iteration an und dazu muss jedes Mal ein neuer Vektor alloziert werden und der allte kopiert. Das ist aber sehr zeitraubend. In den ersten 1000 Zeilen werden also insgesamt SUM(1:1000) * 8 Byte pro DOUBLE * 2 Vektoren Bytes von Betriebssystem angefordert und kopiert.

Ohne pre-allocation hat Dein Programm deshalb ein exponentielles Laufzeitverhalten. Im Endeffekt bedeutet das "ewig".

Nebenbei könnte man so viele Punkte auch gar nicht per PLOT lesbar darstellen: Die Anzahl der Screen-Pixels liegt deutlich darunter.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.08.2011, 08:36     Titel:
  Antworten mit Zitat      
Beim Import-Wizard ist der Speicher nicht sofort voll, er erkennt nur, dass er voll sein wird.

Tutorial.

1. Daten wie im letzten Post in Datei test_forum_204.txt geschrieben
2. File -> Import Data - > test_forum_204.txt auswählen
3. GANZ WICHTIG. GENERATE MATLAB-CODE UNTEN RECHTS AUSWÄHLEN
4. Alle Defaults übernehmen (next, finsih)
5. Code für dieses Datenformat ist fertig. Ggf. von importfile umbenennen.

Andreas

test_forum_204.txt
 Beschreibung:

Download
 Dateiname:  test_forum_204.txt
 Dateigröße:  307.51 KB
 Heruntergeladen:  340 mal
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.08.2011, 08:41     Titel:
  Antworten mit Zitat      
PS. Ein TXT File dieser Syntax mit 230000 Zeilen (10 MB als Datei) lädt bei mir in 1.2s.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Mobman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 04.08.2011, 09:41     Titel:
  Antworten mit Zitat      
Guten Morgen,

und vielen Dank für die Hilfe!
Jetzt habe ich folgendes Problem, ich habe die generierte importfile-Funktion in der Datei importfile.m und eine Datei test.m die mittels importfile('log1.txt') aufruft. Ich bekomme leider folgende Fehlermeldung, weiss jemand wieso?

Code:

??? Undefined function or variable 'filetoRead1'.

Error in ==> importfile at 9
rawData1 = importdata(filetoRead1);

Error in ==> test at 5
importfile('log1.txt');
 


Edit:
Hat sich gelöst, scheinbar ein Groß-/Kleinschreibfehler! Smile

Lieben Gruß
mobman
Private Nachricht senden Benutzer-Profile anzeigen
 
Mobman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 04.08.2011, 11:51     Titel:
  Antworten mit Zitat      
Da die Sache mit importfile letztendlich nicht richtig funktioniert hat, habe ich mein bisheriges Script erweitert. Ich gehe die Datei schrittweise durch. Dies funktioniert soweit sehr gut. Nun möchte ich die Diagramme gerne als Figure (*.FIG) speichern. Leider tritt beim Öffnen der Figures dann folgende Fehlermeldung auf:
Error using ==> open at 162
There is no 'WindowStyle' property in the 'lineseries' class.


Kann mir jemand sagen wie ich das behebe?

Code:

clc;

% 625000 lines (nearly 25 MB)
amount_lines = 1000;

input = 'log1.txt';

filename = input;

fid = fopen(filename);

time_array  = zeros(amount_lines, 1);
value_array = zeros(amount_lines, 1);

z = 1;
while ~feof(fid)

i = 1;
while i <= amount_lines
   
    line          = fgets(fid);
    [time, value] = strtok(line, ';');
    value         = strrep(value, ';', '');
   
    time  = str2double(time);
    value = str2double(value);
   
    time_array(i)  = time;
    value_array(i) = value;
   
    i = i + 1;
end;


handle = plot(time_array, value_array);
xlabel('Zeit');
ylabel('Wert');
if z <= 9
    %saveas(handle, ['export0',int2str(z)], 'jpg');
    hgsave(handle, ['figure0',int2str(z)], 'all');
else
    %saveas(handle, ['export',int2str(z)], 'jpg');
    hgsave(handle, ['figure',int2str(z)], 'all');
end;


z = z + 1;

end;

fclose(fid);
 


Danke!
mobman
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.08.2011, 12:10     Titel:
  Antworten mit Zitat      
Diese Fehlermeldung ist weder intuitiv für mich, nich kommt sie in irgendwelchen MathWorks Datenbankeinträgen vor. Hier bitte ich den Technischen Support zu kontaktieren.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 04.08.2011, 12:43     Titel:
  Antworten mit Zitat      
Hallo
nicht Handle von Plot an HGSAVE übergeben, sondern von Figure

Code:

% zuerst figure aufmachen
% handle von figure nehmen
handle=figure()
plot(1:10,1:10)
% handle von figure abspeichern
hgsave(handle,'test.fig')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mobman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 04.08.2011, 13:25     Titel:
  Antworten mit Zitat      
Hey super, danke!

Jetzt ist nur noch das Problem das sich die Fenster zig Mal öffnen, anstatt nur ein Mal wie zuvor. Gibt es eine Möglichkeit das Fenster gleich wieder zu schliessen? close(handle) funktioniert nicht so wie gehofft.

Edit:
Hab es, super. Danke!!!!!!!
Hatte das close() an der falschen Stelle. Smile

mobman

Zuletzt bearbeitet von Mobman am 04.08.2011, 13:41, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.08.2011, 13:38     Titel:
  Antworten mit Zitat      
Auch danke. Ich habe einen MathWorks-internen Datenbankeintrag gemacht.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 04.08.2011, 13:40     Titel:
  Antworten mit Zitat      
Ach so
Figure einfach vor der Schleife einmal aufmachen


Code:


clc;

% 625000 lines (nearly 25 MB)
amount_lines = 1000;

input = 'log1.txt';

filename = input;

fid = fopen(filename);

time_array  = zeros(amount_lines, 1);
value_array = zeros(amount_lines, 1);

z = 1;
handle= figure();
while ~feof(fid)

i = 1;
while i <= amount_lines
   
    line          = fgets(fid);
    [time, value] = strtok(line, ';');
    value         = strrep(value, ';', '');
   
    time  = str2double(time);
    value = str2double(value);
   
    time_array(i)  = time;
    value_array(i) = value;
   
    i = i + 1;
end;

if ~ishanlde(handle)
handle= figure()
end
plot(time_array, value_array);
xlabel('Zeit');
ylabel('Wert');
if z <= 9
    %saveas(handle, ['export0',int2str(z)], 'jpg');
    hgsave(handle, ['figure0',int2str(z)], 'all');
else
    %saveas(handle, ['export',int2str(z)], 'jpg');
    hgsave(handle, ['figure',int2str(z)], 'all');
end;


z = z + 1;

end;

fclose(fid);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mobman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.08.11
Wohnort: ---
Version: MATLAB 7.11.1 (R2010b) SP1
     Beitrag Verfasst am: 04.08.2011, 13:46     Titel:
  Antworten mit Zitat      
Sehr gut!! Smile
Sagt mal, kennt ihr eine gute split-Funktion. Es gibt nämlich eine neue Anforderung. Die aktuelle Zeile soll nach Delimiter ';' aufgesplittet werden, trotzdem soll JEDES Element - selbst wenn es leer sein sollte - gespeichert werden. Beispiel:

Code:

888.161775;;;;;;;;;;;;;;;;;;;;;;;3184085;
 


1. Element: 888.161775
2. Element: LEER
3. Element: ...
...
24. Element: 3184085


Wisst ihr was ich meine? Denn ich soll nun für JEDES Element einen Graphen im Diagramm zeichnen. Würdet ihr das mit regexp machen und wenn ja, wie?

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 04.08.2011, 13:54     Titel:
  Antworten mit Zitat      
so?
Code:

regexp('888.161775;;;;;;;;;;;;;;;;;;;;;;;3184085;',';','split')
 
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 - 2025 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.