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

Laufzeitoptimierung - für Einlesen der letzten Textzeile?

 

Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 11.11.2015, 12:08     Titel: Laufzeitoptimierung - für Einlesen der letzten Textzeile?
  Antworten mit Zitat      
Hallo,
heute mal eine Optimierungsfrage.

Gegeben:
Ordner mit unterschiedlich vielen Textdateien (Ascii).
Es sind nur die Textdateien für die weitere Verarbeitung interessant, welche in der letzten Zeile der jeweiligen Datei eine error-anzahl != 0 eingetragen haben.
Beispiel:
Code:
[...]
tollertext
[...]
10 errors


Die Zeilenanzahl ist von Datei zu Datei unterschiedlich!

Gibt es in Matlab eine Art Zeilenanzahlrückgabe, ohne die gesamte Datei einzulesen? Also nur eine Art Scan?
Somit könnte ich in textscan die Headerzeilenanzahl auf [Zeilenzahl-1] setzten.

Oder eine Funktion, mit der ich elegant nur auf die letzte Zeile zugreifen kann?
feof bringt mir leider nicht den Zugriff auf die letzte Zeile.

Derzeit lese ich alles per textscan ein, verwerfe dann alles, wenn Schlüsselwort nicht in letzter Zeile enthalten, oder behalte alles, da ich damit arbeiten muss, wenn Schlüssel enthalten.

Ich kann mittels fgetl natürlich durchparsen und erst die letzte Zeile auswerten. Aber die Zeilen [1:end-1] sind ja überflüssig. Zumal so in jeder Zeile der Vergleich auf das Schlüsselwort "error" hinzukommt.

Den Lesezugriff auf jede Zeile habe ich mit beiden Methoden.

Auch für dlmread müsste ich wissen, wie viele Zeilen ich überspringen muss. Denn nur die letzte Zeile enthält als ersten Wert eine Ziffer.

Übersehe ich eine Möglichkeit?
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit:

Code:
M = memmapfile('error.txt');
idx = find(M.Data == 10, 1, 'last'); % 10 = Zeilenvorschub
lastline = char(M.Data(idx+1:end))'


Ich bin gespannt, ob das was hinsichtlich Geschwindigkeit bringt und wieviel.
Vielleicht kann man lastline sogar analysieren, ohne in char umzuwandeln.

Falls die letzte Zeile immer "x errors " lautet, ginge z.B.
Code:
noErrors = M.Data(end-9) == 48 && M.Data(end-10) == 10;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 12.11.2015, 10:04     Titel:
  Antworten mit Zitat      
Guten Morgen,
danke für die Antwort. Diese Möglichkeit hatte ich tatsächlich nicht auf dem Schirm!

Leider bringt es aber hinsichtlich Laufzeit nix, sondern es wird sogar langsamer.
Ich hab jetzt sogar nur mal das reine (fopen+textscan+fclose) der Variante memmapfile gegenübergestellt. Also _ohne_ irgendwas mit den Daten zu machen. Und auch da ist die erste Variante mit Textscan schneller.

Bei ca. 450files nur für Einlesen jeweils:
Textscan = [0,089 ... 0,11]sec
memmapfile = [0,21 ... 0,25]sec

Also vernachlässigbar. Da "frisst" die restliche Verarbeitung der gewählten Files dann deutlich mehr.

Vermutlich ist mein Ausgangspunkt, dass es doch umständlich und somit zeitfressend sein _muss_, wenn so viele Zeilen umsonst durchsucht werden, nicht korrekt.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 12.11.2015, 10:26     Titel: Re: Laufzeitoptimierung - für Einlesen der letzten Textzeil
  Antworten mit Zitat      
Hallo Mmmartina,

Versuche mal dies:
Code:
FileName = fullfile(Folder, File);
fid = fopen(FileName, 'r');   % Oder 'r+' !!!
if fid == -1
  error('Cannot open file: %s', FileName);
end

lastLine = '';
fseek(fid, -20, 1);  % if last line is guaranteed to be shorter than 20 characters!!!
while ~feof(fid)
  lastLine = fgetl(fid);
end
nError = sscanf(lastLine, '%d', 1);

Läuft das? Falls eine oder mehrere leere Zeilen am File-Ende stehen:
Code:
lastLine = 'NaN';
fseek(fid, -20, 1);  % if last line is guaranteed to be shorter than 20 characters!!!
while ~feof(fid)
  aLine = fgetl(fid);
  if ischar(aLine) && ~isempty(aLine)
      lastLine = aLine;
  end
end
nError = sscanf(lastLine, '%d', 1);

Gruß Jan

[EDITED, Jan] Argumente fon fseek waren vertauscht.

Zuletzt bearbeitet von Jan S am 14.11.2015, 01:03, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 13.11.2015, 15:12     Titel:
  Antworten mit Zitat      
Hallo Jan,
jetzt komm ich endlich dazu, deinen Vorschlag mal zu testen.

Dein Vorschlag funktioniert so nicht, sondern bringt für die fseekzeile:
??? Error using ==> fseek
Invalid origin.

Was ich seltsam finde, da ich die Anleitung dazu so verstehen würde, dass man eben tatsächlich z.B. -20 einsetzen könnte. Aber scheinbar akzeptiert er für origin nur bof, cof und eof.

Wenn ich die Zahl aber unter offset eintrage, funzt es.
Code:
fseek(fid, -20, 'eof')


Nun muss ich den Offset aber größer machen, da die Anzahl der Fehler natürlich mehrstellig sein könnte. Daher ist die Zeilenlänge der letzten Zeile nicht fest. Bewirkt, dass ich teilweise auch die vorletzte Zeile durchsuche, aber das ich immer noch besser, als von Anfang an zu suchen.
Laufzeitmäßig bringt es auch tatsächlich unterschiede! Wie zu erwarten vor allem, wenn viele lange Dateien vorhanden sind!

Sehr schön, genau das, was ich gesucht habe!
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 14.11.2015, 01:05     Titel:
  Antworten mit Zitat      
Hallo Mmmartina,

Ja, ich hatte die letzten beiden Argumente von fseek vertauscht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.