|
|
readtable bei großen datenmengen |
|
InfoIngo |
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 16.12.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.12.2016, 16:30
Titel: readtable bei großen datenmengen
|
|
|
|
|
Hallo,
ich habe große Datenmengen die in einer .txt Datei so vorliegen:
Zitat: |
Achse 1
Mittenposition [N] -5000,000
Geschwindigkeit [N/s] 450,000
Amplitude [N] 3000,000
Frequenz [Hz] 2,000
Phase 0,000
Aufblenden Lastwechsel 20
Kurvenform Sinus
Lastwechsel 8000
Reglerparameter Achse 1
Folgeregler
Weg Kraft
Messbereich 100 %
P 1,000 P 0,250
I 0,000 I 0,250
Spitzenwertregler
Weg Kraft
P (Mitte) 0,100 P (Mitte) 0,250
I (Mitte) 0,100 I (Mitte) 0,150
P (Ampl) 0,100 P (Ampl) 0,100
I (Ampl) 0,100 I (Ampl) 0,100
Grenzen
Min Max
Kraft [N] -9000,000 -1000,000
Weg [mm] -6,000 6,000
Weg_Time [s] Weg [mm] Kraft_Time [s] Kraft [N] Extern 1_Time [s] Extern 1 [V] Extern 2_Time [s] Extern 2 [V] Weg_MIN_Periode Weg_MIN [mm] Weg_MAX_Periode Weg_MAX [mm] Kraft_MIN_Periode Kraft_MIN [N] Kraft_MAX_Periode Kraft_MAX [N] Extern 1_MIN_Periode Extern 1_MIN [V] Extern 1_MAX_Periode Extern 1_MAX [V] Extern 2_MIN_Periode Extern 2_MIN [V] Extern 2_MAX_Periode Extern 2_MAX [V]
3,1675 3,27 3,1675 -4989,0 3,1675 2,23 3,1675 1,68 0 3,27 0 3,27 0 -5018,5 0 -4989,0 0 2,22 0 2,26 0 1,86 0 1,87
3,1705 3,27 3,1705 -4991,0 3,1705 2,23 3,1705 1,67 0 3,27 0 3,27 0 -5022,1 0 -5010,4 0 2,22 0 2,26 0 1,86 0 1,87
3,1735 3,27 3,1735 -4991,6 3,1735 2,22 3,1735 1,67 0 3,27 0 3,28 0 -5018,5 0 -4940,1 0 2,22 0 2,26 0 1,85 0 1,87
3,1765 3,27 3,1765 -4992,9 3,1765 2,24 3,1765 1,67 0 3,27 0 3,28 0 -4983,9 0 -4866,0 0 2,22 0 2,26 0 1,83 0 1,86
3,1795 3,27 3,1795 -4993,2 3,1795 2,24 3,1795 1,67 0 3,27 0 3,28 0 -4966,7 0 -4807,4 0 2,22 0 2,26 0 1,81 0 1,86
|
Tab als Trennzeichen, die Dezimaltrennstelle ist ein Komma.
Diese Datein können schnell über 6GB groß werden und überfordern beim einfachen einlesen schon direkt den PC mit folgendem Befehl:
t =readtable('a.txt');
Ich benötige ab Zeile 34 die Spalten: 1,2,4,6 und 8 als "double".
Bisher habe ich einen Weg, der mir und auch sonst keinem gefallen wird - und auch mehrere Stunden braucht. Ich stelle ihn gerne vor
Readtable liest irgendwie automatisch ab Zeile 34 ein...
Dadurch entsteht eine beliebig lange x 24 spaltige "table" Workspace Datei.
In diesem fall eine knapp 40 Millionen * 24 Matrix.
Zitat: |
t=readtable('a.txt');
laenge=39228000;
zeit = t(1:laenge,1);
weg = t(1:laenge,2);
kraft = t(1:laenge,4);
v1 = t(1:laenge,6);
v2 = t(1:laenge,;
clear t;
zeit=table2array(zeit);
zeit=strrep(zeit, ',', '.');
zeit=str2double(zeit);
weg=table2array(weg);
weg=strrep(weg, ',', '.');
weg=str2double(weg);
kraft=table2array(kraft);
kraft=strrep(kraft, ',', '.');
kraft=str2double(kraft);
v1=table2array(v1);
v1=strrep(v1, ',', '.');
v1=str2double(v1);
v2=table2array(v2);
v2=strrep(v2, ',', '.');
v2=str2double(v2);
|
Zwischendrinn lösche ich die unnötigen Sachen aus dem Workspace, da mein Speicher immer überlastet ist. - Das Ganze führe ich als Script aus, dort dauert es deutlich länger, als wenn ich alles in die Konsole eintippe (jeden Schritt einzeln), jedoch läuft es dann automatisiert...
Ich gehe davon aus, dass ich hier wie ein Elefant im Porzellanladen agiere und ersuche mir Hilfe
Ansonsten lass ich diese Sachen dann wohl oder übel über Nacht laufen...
Verbesserung sehe ich im Einlesen - wenn ich nur 8 Spalten brauche muss ich eigentlich nicht alle 24 einlesen.
Die konvertierung vom typ "cell" zum typ "double" über den Befehl (ersetze alle "," durch ".") ist sehr zeitintensiv.
#Edit - Version R2016b#
DANKE im Voraus für eure Mühe!
Gruß Ingo
Zuletzt bearbeitet von InfoIngo am 16.12.2016, 17:35, insgesamt einmal bearbeitet
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.12.2016, 17:30
Titel:
|
|
Hallo,
welche MATLAB-Version hast du? Ab R2014b würde sich
datastore
anbieten. Dort kannst du einfach die benötigten Spalten auswählen statt alles einzulesen und dann einen großen Teil wieder wegzuwerfen.
Das geht davon abgesehen auch bei readtable, wenn du 'Format' angibst und '%*f' für zu überspringende Spalten verwendest.
Was die Kommata als Dezimaltrennzeichen angeht, würde ich die Datei entsprechend vorverarbeiten, siehe z.B. hier:
https://de.mathworks.com/matlabcent.....-with-comma-decimal-point
Grüße,
Harald
|
|
|
InfoIngo |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 16.12.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.12.2016, 17:45
Titel:
|
|
Hallo Harald,
danke für deine Antwort!
Zitat: |
b = readtable('a.txt','%s,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f,%*f');
Error using readtable (line 197)
Wrong number of arguments.
|
Ich hab auch keine Ahnung wie ich Matlab das Format da passend einverleibe, so jedenfalls noch nicht.
Zitat: |
>> b = readtable('a.txt','%s %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f');
Error using readtable (line 197)
Wrong number of arguments.
|
So auch nicht
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.12.2016, 18:13
Titel:
|
|
Hallo,
die zweite Version sieht besser aus, da fehlt nur 'Format'.
Bitte auch in die Doku schauen. Die Syntax im Beispiel "Create and Format Table from Text File" ist genau das, was du brauchst.
Grüße,
Harald
|
|
|
InfoIngo |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 16.12.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.01.2017, 16:47
Titel:
|
|
Um es abzuschließen, hier meine Lösung die ich dann hatte.
Danke an Harald!
Zitat: |
fn='DATEINAME DER DATEI.txt';
file = memmapfile(fn,'Writable',true);
comma = uint8(',');
point = uint8('.');
file.Data(( file.Data==comma)' ) = point;
ds = tabularTextDatastore(fn,'TreatAsMissing','NA','SelectedVariableNames',{'Weg_Time_s_'});
wz=table2array(readall(ds));
ds = tabularTextDatastore(fn,'TreatAsMissing','NA','SelectedVariableNames',{'Weg_mm_'});
w=table2array(readall(ds));
|
Ich überschreibe damit die original Datei und mache aus "," je ein "."
Anschließend wird verarbeitet.
Gibt man in die Konsole nur ds (mein variablenname für tabularTextDatastore) ein kann man sich die Spalten die zur Auswahl stehen ansehen und diese dann vorauswählen.
Mit dieser Methode bin ich bisher sehr effizient unterwegs.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 09.01.2017, 17:00
Titel:
|
|
Hallo,
mit
preview(ds)
kannst du dir auch schön einen Überblick verschaffen.
Grüße,
Harald
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|