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

Extrem viele Daten einlesen, csv, alles versucht :(

 

rekcat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 16:38     Titel:
  Antworten mit Zitat      
Wow Winkow!! Vielen Dank!! Ich werde dein Code so bald wie möglich (heute Abend oder morgen früh) ausprobieren, bin schon gespannt!!! Surprised
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.07.2015, 16:47     Titel:
  Antworten mit Zitat      
ok ich hab nochmal rumgespielt
extra funktion mit
Code:
function out=land(in)
switch in
    case 'DE'
        out=uint8(1);
    case 'FR'
        out=uint8(2);
    otherwise
        out=uint8(0);
end
[da müssen halt die länder rein die es so gibt
und dann
Code:
fid = fopen('Beispielzeilen.csv');
tline = fgetl(fid);
tline = fgetl(fid);
format=[repmat('%*s',1,7),'%s%s',repmat('%*s',1,5),'%s',repmat('%*s',1,3),'%s',repmat('%*s',1,9)];
k=1;
laenge=60000; % geschätze anzahl der zeilen. lieber ein paar mehr als weniger.
Data{1}=uint8(zeros(laenge,1));
Data{2}=uint8(zeros(laenge,1));
Data{3}=zeros(laenge,1);
Data{4}=zeros(laenge,1);
while ischar(tline)
    tline2=textscan(tline,format,'delimiter',';');
    Data{1}(k)=land((tline2{1}{1}));
    Data{2}(k)=land((tline2{2}{1}));
    Data{3}(k)=str2double(strrep(tline2{3},',','.'));
    Data{4}(k)=datenum(tline2{4},'dd.mm.yyyy HH:MM');
    tline = fgetl(fid);
    k=k+1;
end
fclose(fid)

grüße
ps das mit categorical würde ich trotzdem gerne wissen. wie geht das ohne das ich die file einmal komplett geladen hab harald? das ich damit die daten reduzieren kann hab ich verstanden aber dazu brauch ich sie ja erstmal im speicher.
edit: speicher reservierung vergessen.
stell dich auf ein wenig rechenzeit ein. für 15k zeilen brauch ich mit meiner ssd und so ca 4.5 sek bei 10 millionen zeilen sind das also dann ca 50min. also speicher das ergebniss danach in nem mfile ab oder so Smile damit du das nicht mehr als einmal machen musst Razz
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich würde aus Effizienzgründen wie gesagt vorschlagen, die Kommas vorab durch Punkte zu ersetzen, siehe z.B.
http://stackoverflow.com/questions/.....converting-comma-to-point
Dann können die Zahlen direkt als solche eingelesen werden.

Einlesen als Categorical: %C
Einlesen als Datetime: %D
Beides wurde mit R2014b eingeführt.

Desweiteren können Daten schön als Tables organisiert werden.
Code:
comma2point_overwrite('Beispielzeilen.csv')
fmt=[repmat('%*s',1,7),'%C%C',repmat('%*s',1,5),'%32f',...
    repmat('%*s',1,3),'%{dd.MM.yyyy HH:mm}D',repmat('%*s',1,9)];
T = readtable('Beispielzeilen.csv', 'Format', fmt, 'Delimiter', ';');


In der Form benötigen die Daten 26823 Bytes. Bei 10000 mal so vielen Zeilen sprechen wir also von größenordnungsmäßig 260 MB.

Ach so... Laufzeit bei mir für die Beispieldatei mit 10000 Zeilen: < 0,1s.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.07.2015, 19:18     Titel:
  Antworten mit Zitat      
Zitat:
Einlesen als Categorical: %C
Einlesen als Datetime: %D
Beides wurde mit R2014b eingeführt.

hab noch 2014a da kommt das bei mir eh nicht in frage. ist aber schonmal gemerkt Smile
Zitat:
ich würde aus Effizienzgründen wie gesagt vorschlagen, die Kommas vorab durch Punkte zu ersetzen, siehe z.B.
http://stackoverflow.com/questions/.....converting-comma-to-point

das stimmt das spart zeit.
Zitat:
Ach so... Laufzeit bei mir für die Beispieldatei mit 10000 Zeilen: < 0,1s.

die beispieldatei hat aber nur 1000 zeilen. Smile
deine lösung ist weitaus eleganter aber vieleicht hat ja jemand noch ne alte matlab version und kann meinen ansatz auch gebrauchen Razz
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.07.2015, 20:24     Titel:
  Antworten mit Zitat      
Hallo,

ups @ 1000 vs. 10000 Zeilen.
Ich müsste die Datei wohl mal aufbohren, um Laufzeiten für ca. 15000 Zeilen zu bekommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.07.2015, 20:32     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

ups @ 1000 vs. 10000 Zeilen.
Ich müsste die Datei wohl mal aufbohren, um Laufzeiten für ca. 15000 Zeilen zu bekommen.

Grüße,
Harald

das ist bestimmt immernoch schneller. für die beispieldatei braucht meine version 0.3s ca. ich denke schon alleine das ordentliche einlesen als datum könnte zeit sparen. meine version braucht über 50% für die umwandlung der daten da.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rekcat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2015, 15:42     Titel:
  Antworten mit Zitat      
Wiedermal, vielen Dank!! Very Happy
Ich habe die Codes von Winkow heute für ein relativ kleines File versucht, hat super geklappt. Ich installiere gerade die 2015a Version, danach jag ich mal das dicke File rein Surprised

Harald, bei deinem Ansatz hätte ich noch eine Frage:

Die Idee ist auch wie beim Winkow Ansatz, ich schreibe eine Funktion und lade sie nachher ins script. Ich bin mir nur nicht ganz sicher, ob der Code so stimmt. Bei der Funktion krieg ich keinen Fehler, aber beim Offset steht eine 0, ich denke das heisst, dass nichts verändert wurde?

Code:
function output=comma2point_overwrite(~)
    output = memmapfile('D:\Beispielzeilen.csv', 'writable', true);
    comma = uint8(',');
    point = uint8('.');
    output.Data(output.Data==comma) = point;
end  


Und ich glaube, beim Script binde ich irgend etwas falsch ein. Ich sehe gerade den Wald nicht mehr;

Code:
comma2point_overwrite('D:\Beispielzeilen.csv');
fmt=[repmat('%*s',1,7),'%C%C',repmat('%*s',1,5),'%32f',...
    repmat('%*s',1,3),'%{dd.MM.yyyy HH:mm}D',repmat('%*s',1,9)];
T = readtable('D:\Beispielzeilen.csv', 'Format', fmt, 'Delimiter', ';');  



Man hätt ich jetzt gerne eure Matlab Skills Rolling Eyes

Viele Grüsse
rekcat
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.07.2015, 15:54     Titel:
  Antworten mit Zitat      
warum benutzt du nicht einfach den code der auf stackoverflow gegeben wurde? warum schreibst du die funktion um =? wozu brauchst du den die memorymap als rückgabe ? ob es geklappt hat sihst du doch daran ob in deiner file jetzt alle kommas durch punkte ersetzt wurden. das kannst du doch fix nachgucken.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rekcat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2015, 08:59     Titel:
  Antworten mit Zitat      
Okay, mit dem kleinen File hats jetzt geklappt! Smile jetzt versuche ich noch dein DE-replacement damit zu verbinden und dann gehts dem Grossen an den Kragen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.07.2015, 09:05     Titel:
  Antworten mit Zitat      
wenn du die 2015a jetzt installiert hast würde ich es eher so machen wie harald vorgeschlagen hat. dann brauchst du das mit dem DE und so nicht. das ist bei harald schon über die categoricals drin.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rekcat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2015, 11:00     Titel:
  Antworten mit Zitat      
Mein Rechner/Version hat wahrscheinlich einfach zu wenig Leistung, aber ich habe jetzt die Winkow Lösung am PC an der Uni angewendet, funktioniert super!! Vielen Dank, ihr seid Helden!! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.