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

Riesige Datenmengen von TXT einlesen und Plotten

 

Lars_Larsen
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.11.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2023, 11:17     Titel: Riesige Datenmengen von TXT einlesen und Plotten
  Antworten mit Zitat      
Hallo zusammen,

ich möchte wirklich riesige Datenmengen (25 Spalte x 3,7 mio Zeilen) aus einer TXT Datei ( ca. 250 mb) einlesen und daraus ein Liniendiagramm erstellen.

Ich habe in anderen Beiträgen gelesen, dass das Grundsätzlich möglich sein sollte, auch wenn es lange dauert. Ich lasse auf meinen PC ( AMD Ryzen 6X3,6 GHz, 32gb Ram) jetz seit ca 24h rechnen aber es tut sich nichts. (Matlab R2023b). Wenn ich die Datei drastisch verkleinere funktioniert es.

Ich packe euch noch eine kleine TXT Datei in den Anhang dazu. Falls jemand die Große zum testen haben möchte, müssten ich die nochmal irgendwie seperat hochladen, das Forum scheint so große Uploads nicht zu unterstützen.

Meine Frage:

Ist Matlab in der Lage diese Millionen an Datenpunkten in ein Diagramm zu Plotten?
falls ja, warum funktioniert es bei mir nicht?

Code:
% Das ist mein Programm.
% Datei importieren
filePath = 'C:\Users\lars-\Desktop\Projekte\Kühlschrank\Auswertung Datenlogger\04.11.txt';
fileID = fopen(filePath, 'r');

% Initialisiere Variablen
data = [];
lineNumber = 0;

% Lese die Datei Zeile für Zeile
while ~feof(fileID)
    line = fgetl(fileID);
    lineNumber = lineNumber + 1;
   
    % Überprüfe, ob die Zeile unerwünschte Daten enthält
    if ~contains(line, 'Neustart')
        % Zeile enthält keine unerwünschten Daten, verarbeite sie weiter
        numericValues = str2double(strsplit(line, ','));
       
        if ~any(isnan(numericValues))
            % Multipliziere die spezifischen Spalten mit den angegebenen Faktoren
            numericValues(4) = numericValues(4) * 300;
            numericValues(5) = numericValues(5) * 3;
            numericValues(6) = numericValues(6) * 4;
            numericValues(8) = numericValues(8) * (300+1);
            numericValues(10) = numericValues(10) * (300+2);
            numericValues(12) = numericValues(12) * (300+3);
            numericValues(14) = numericValues(14) * (300+4);
            numericValues(15) = numericValues(15) * 9;
            numericValues(16) = numericValues(16) * 10;
           
            data = [data; numericValues];
        end
    end
end

% Schließe die Datei
fclose(fileID);

% Erstelle eine Vektor für die Zeilennummer
x = 1:size(data, 1);

% Entferne die Spalten, die nicht im Diagramm angezeigt werden sollen
columnsToExclude = [1, 2, 7, 9, 11, 13, 17];
data(:, columnsToExclude) = [];

% Erstelle das Liniendiagramm mit individuell zugewiesenen Farben
hold on;

% Linie 1: Magenta
plot(x, data(:, 1), 'm', 'DisplayName', 'BFS-POWER-RELAIS-PIN');

% Linie 2: Grün
plot(x, data(:, 2), 'g', 'DisplayName', 'HEIZUNG-RELAIS-PIN');

% Linie 3: Gelb
plot(x, data(:, 3), 'y', 'DisplayName', 'PUMPE-WT-RELAIS-PIN');

% Linie 4: Blau
plot(x, data(:, 4), 'b', 'DisplayName', 'BEWAESSERUNG-VR-RELAIS-A-PIN');

% Linie 5: Grün
plot(x, data(:, 5), 'g', 'DisplayName', 'BEWAESSERUNG-VL-RELAIS-A-PIN');

% Linie 6: Rot
plot(x, data(:, 6), 'r', 'DisplayName', 'BEWAESSERUNG-HR-RELAIS-A-PIN');

% Linie 7: Gelb
plot(x, data(:, 7), 'y', 'DisplayName', 'BEWAESSERUNG-HL-RELAIS-A-PIN');

% Linie 8: Rot
plot(x, data(:, 8), 'r', 'DisplayName', 'CO2-RELAIS-PIN');

% Linie 9: Blau
plot(x, data(:, 9), 'b', 'DisplayName', 'KOMPRESSOR-RELAIS-PIN');

% Linie 10: Grün
plot(x, data(:, 10), 'g', 'DisplayName', 'Licht');

% Linie 11: Blau
plot(x, data(:, 11), 'b', 'DisplayName', 'Temperatur');

% Linie 12: Grün
plot(x, data(:, 12), 'g', 'DisplayName', 'Luftfeuchte');

% Linie 13: Rot
plot(x, data(:, 13), 'r', 'DisplayName', 'Co2 Gehalt');

% Linie 14: Blau
plot(x, data(:, 14), 'b', 'DisplayName', 'BFS-VL-SIGNAL');

% Linie 15: Rot
plot(x, data(:, 15), 'r', 'DisplayName', 'BFS-VR-SIGNAL');

% Linie 16: Grün
plot(x, data(:, 16), 'g', 'DisplayName', 'BFS-HR-SIGNAL');

% Linie 17: Schwarz
plot(x, data(:, 17), 'k', 'DisplayName', 'BFS-HL-SIGNAL');

% Linie 18: Magenta
plot(x, data(:, 18), 'm', 'DisplayName', 'Lüfter Drehzahl');

% Füge weitere Linien hinzu und weise ihnen individuelle Farben zu.

hold off;

% Legende hinzufügen (nur mit den im Diagramm verbleibenden Spalten)
legend('show'); % Zeige die Legende

xlabel('Zeilennummer');
ylabel('Wert');
title('Liniendiagramm der Daten aus der Textdatei');

grid on; % Raster aktivieren
 



Hinweis:

Ist mein erster Beitrag hier, falls ich was vergessen haben weist mich bitte drauf hin.

05.11.txt
 Beschreibung:

Download
 Dateiname:  05.11.txt
 Dateigröße:  469.33 KB
 Heruntergeladen:  141 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

die Daten sollten dann 25*3.7e6*8 Bytes, also rund 740 MB umfassen. Für einen modernen Rechner sollte das kein Problem sein.

Ich würde versuchen, die Daten mit einer Funktion wie readmatrix zu importieren. Das sollte deutlich effizienter sein als das zeilenweise Einlesen mit fgetl. Die Spalten können auch als ganze mit dem gewünschten Wert multipliziert werden statt jede einzeln. Zeilen mit NaN oder ##Neustart## (wie Zeile 4069 im Beispiel) können mit rmmissing entfernt werden.

Die Visualisierung kann bei derart vielen Werten problematisch werden. Die Anzahl der Datenpunkte überschreitet ohnehin die Auslösung jedes denkbaren Bildschirms. Insofern könnte ich mir vorstellen, dass man beispielsweise immer 1000 Werte mittelt oder, um nichts zu verlieren, jeweils Minimum und Maximum über 1000 Werte plottet.

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
 
Lars_Larsen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.11.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2023, 20:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank schonmal für deine Antwort.

"Ich würde versuchen, die Daten mit einer Funktion wie readmatrix zu importieren. Das sollte deutlich effizienter sein als das zeilenweise Einlesen mit fgetl. Die Spalten können auch als ganze mit dem gewünschten Wert multipliziert werden statt jede einzeln. Zeilen mit NaN oder ##Neustart## (wie Zeile 4069 im Beispiel) können mit rmmissing entfernt werden. "

Den Part werde ich gleich mal ausprobieren, ich halte euch auf dem laufenden ob es dadurch schneller wird.

"Die Visualisierung kann bei derart vielen Werten problematisch werden. Die Anzahl der Datenpunkte überschreitet ohnehin die Auslösung jedes denkbaren Bildschirms. Insofern könnte ich mir vorstellen, dass man beispielsweise immer 1000 Werte mittelt oder, um nichts zu verlieren, jeweils Minimum und Maximum über 1000 Werte plottet. "

Hier hoffe ich es übers Zoomen relativ übersichtlich zu halten. Die Daten bestehen aus Messwerten und aus Zustandsgrößen (Heizung an oder aus 1 oder 0), wenn ich die Zustandsgrößen mittel oder ähnliches, sind sie leider nicht mehr für mich zu gebrauchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2023, 21:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Hier hoffe ich es übers Zoomen relativ übersichtlich zu halten.

Wenn du ohnehin in bestimmte Bereiche zoomen willst, dann würde ich von vorneherein nur diese plotten.

Zitat:
wenn ich die Zustandsgrößen mittel oder ähnliches, sind sie leider nicht mehr für mich zu gebrauchen.

Mitteln ist problematisch, aber was spricht gegen min. und max? Dann siehst du, ob in dem komprimierten Zeitraum die Heizung durchgehend an oder aus war oder ob hin- und hergeschaltet wurde.

Randbemerkung: ich würde entweder mehr Farben wählen (über RGB Code) oder verschiedene Linienarten oder Marker, um die Linien besser unterscheidbar zu machen.

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
 
Lars_Larsen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.11.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2023, 13:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
Wenn du ohnehin in bestimmte Bereiche zoomen willst, dann würde ich von vorneherein nur diese plotten.


Die Bereiche die ich genauer betrachten will ergeben sich leider erst durch die Visulaisierung durch das gesamte Diagramm.


Ich bin jetzt endlich dazu gekommen den Code zu überarbeiten und es funktioniert super mit deinen Verbesserungsvorschlägen, vielen Dank dafür.

Hier nochmal der überarbeitete Code:

Code:
% Datei importieren
filePath = 'C:\Users\lars-\Desktop\Projekte\Kühlschrank\Auswertung Datenlogger\22.11.txt';
data = readmatrix(filePath, 'Delimiter', ',');

% Extrahiere den numerischen Teil der Daten
numericData = data(:, 1:25); % Passe die Spaltenauswahl an

% Multipliziere die Spalten mit den gewünschten Werten
multipliers = [300, 1, 2, (300+1), (300+2), (300+3), (300+4), 3, 4, 5, 1, 1, 0.01, 1, 1, 1, 1, 1];
numericData(:, [3, 4, 5, 6, 8, 10, 12, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25]) = numericData(:, [3, 4, 5, 6, 8, 10, 12, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25]) .* multipliers;

% Erstelle eine Vektor für die Zeilennummer
x = 1:size(numericData, 1);

% Erstelle das Liniendiagramm mit individuell zugewiesenen Farben
hold on;

% Linie 1: Magenta
plot(x, numericData(:, 3), 'm', 'DisplayName', 'BFS-POWER-RELAIS-PIN');

% Linie 2: Grün
plot(x, numericData(:, 4), 'g', 'DisplayName', 'HEIZUNG-RELAIS-PIN');

% Linie 3: Gelb
plot(x, numericData(:, 5), 'y', 'DisplayName', 'PUMPE-WT-RELAIS-PIN');

% Linie 4: Blau
plot(x, numericData(:, 6), 'b', 'DisplayName', 'BEWAESSERUNG-VR-RELAIS-A-PIN');

% Linie 5: Grün
plot(x, numericData(:, 8), 'g', 'DisplayName', 'BEWAESSERUNG-VL-RELAIS-A-PIN');

% Linie 6: Rot
plot(x, numericData(:, 10), 'r', 'DisplayName', 'BEWAESSERUNG-HR-RELAIS-A-PIN');

% Linie 7: Gelb
plot(x, numericData(:, 12), 'y', 'DisplayName', 'BEWAESSERUNG-HL-RELAIS-A-PIN');

% Linie 8: Rot
plot(x, numericData(:, 14), 'r', 'DisplayName', 'CO2-RELAIS-PIN');

% Linie 9: Blau
plot(x, numericData(:, 15), 'b', 'DisplayName', 'KOMPRESSOR-RELAIS-PIN');

% Linie 10: Grün
plot(x, numericData(:, 16), 'g', 'DisplayName', 'Licht');

% Linie 11: Blau
plot(x, numericData(:, 18), 'b', 'DisplayName', 'Temperatur');

% Linie 12: Grün
plot(x, numericData(:, 19), 'g', 'DisplayName', 'Luftfeuchte');

% Linie 13: Rot
plot(x, numericData(:, 20), 'r', 'DisplayName', 'Co2 Gehalt');

% Linie 14: Blau
plot(x, numericData(:, 21), 'b', 'DisplayName', 'BFS-VL-SIGNAL');

% Linie 15: Rot
plot(x, numericData(:, 22), 'r', 'DisplayName', 'BFS-VR-SIGNAL');

% Linie 16: Grün
plot(x, numericData(:, 23), 'g', 'DisplayName', 'BFS-HR-SIGNAL');

% Linie 17: Schwarz
plot(x, numericData(:, 24), 'k', 'DisplayName', 'BFS-HL-SIGNAL');

% Linie 18: Magenta
plot(x, numericData(:, 25), 'm', 'DisplayName', 'Lüfter Drehzahl');
% Füge weitere Linien hinzu und weise ihnen individuelle Farben zu.

hold off;

% Legende hinzufügen (nur mit den im Diagramm verbleibenden Spalten)
legend('show'); % Zeige die Legende

xlabel('Zeilennummer');
ylabel('Wert');
title('Liniendiagramm der Daten aus der Textdatei');

grid on; % Raster aktivieren

 
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 - 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.