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
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2015, 16:14     Titel: Extrem viele Daten einlesen, csv, alles versucht :(
  Antworten mit Zitat      
Hallo zusammen

Ich durchstöbere etwa seit einer Woche gefühlt alle Matlab Foren der Welt. Ich habe auch bereits viele Einträge mit ähnlichen Problemen und Lösungen gefunden, aber nicht hat bei mir geklappt:

Ich habe ein File mit Daten; Strings und numbers. Es sind etwa 10'000'000 Zeilen und 28 Spalten: Wenn ich das File einlesen möchte, kommt eine Fehlermeldung, dass der Speicher nicht genügend gross sei, daher dachte ich zB man könnte vllt immer nur 1'000'000 Mio. Zeilen einzulesen, um dann diese Matrizen am Schluss aneinander zu hängen. Ist das eine gute Überlegung, oder gibt es hier eine bessere Lösung, mit welcher man mehr Daten reinkriegt? (Könnte man mit textscan zb die erste Mio. Zeilen einlesen?)

Code:
fid = fopen('Filepfad.csv'); %open file
 headers = fgetl(fid);    %get first line
 headers = textscan(headers,'%s','delimiter',';'); %read first line
 format = repmat('%s',1,size(headers{1,1},1)); %count columns and make format string
 data = textscan(fid,format,'delimiter',';'); %read rest of the file
 data = [data{:}];


Die Fehlermeldung ist folgende:

Code:
??? Error using ==> textscan
Out of memory. Type HELP MEMORY for your options.

Error in ==> Untitled at 8
 data = textscan(fid,format,'delimiter',';'); %read rest of the file



Code:
Das File hat in der ersten Zeile Titel, danach alles Daten bzw. Wörter, bsp.:
Country             Weekday          Date/ Time                Price (leider als String)
Deutschland           FR         12.04.2008 20:12:00                44,00


Ich habe auch den Direktimport von Access versucht (ist das einzige Programm, mit dem ich das File öffnen konnte), hab ich auch nicht hingekriegt... Ich wäre extrem froh über Hilfe von euch Matlabprofis Smile

Viele Grüsse
rekcat
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: 22.07.2015, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

selbst wenn die Datei nur aus Double-Werten besteht, nimmt sie 2,28 GB Speicher in Anspruch.
Wieviel Hauptspeicher hast du denn? Wieviele der Spalten sind numerisch, wieviele Strings?

Für numerische Daten sollte auf jeden Fall ein entsprechender Identifier angegeben werden, z.B. '%f' für Double. Wenn möglich können auch speichersparendere Datentypen gewählt werden.

Sind die Strings eindeutig oder kommen beispielsweise sehr viele Wiederholungen vor? In letzterem Fall können Categoricals eine gute Lösung sein.

Datumsangaben können ab R2014b wirklich als solche eingelesen werden.

Weekday ist dann z.B. unnötige Zusatzinfo, die man ja überspringen kann.

Kommt Komma nur als Dezimaltrennzeichen vor? Dann würde ich vorab alle Kommas durch Punkte ersetzen.

Wenn du einen kleinen Teil der Daten (sagen wir, die ersten 1000 Zeilen) zur Verfügung stellst, kann man sich ein deutlich besseres Bild machen.

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: 22.07.2015, 16:32     Titel:
  Antworten mit Zitat      
hallo. das siht irgendwie nicht wie 28 spalten aus.
ehr wie 5
beispieldaten sollten schon das wesentliche enthalten.
so wie deine daten aussehen verbauchen 10 millionen zeilen davon ca 6GB ram. wie viel ram steht dir denn zur verfügungbzw hast du eine 64bit version von matlab?
wie man ein , durch einen punkt ersetzt steht hier schon öfter im forum und es gibt auch vertige lösungen im fileexchange. einzeln einlesen und dann zusammen bappen ohne die daten zu reduzieren bringt dir nix. falls du wirklich so wenig ram hast wird dir nix anders übrigbleiben als die daten neu zu codieren. ich kann mir vorstellen jede zeile einzulesen und dann die wochentage in nummern zu wandeln das selbe gilt für ländern und das datum. damit spaarst du wahrscheinlich ne menge speicher.
grüße
_________________

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: 22.07.2015, 17:08     Titel:
  Antworten mit Zitat      
Wow vielen Dank für eure super schnellen Antworten Shocked

Jap, sorry, das waren wirklich nur Beispiele. Ich schicke hier im Anhang ein paar Zeilen der Originaldaten. Ich bräuchte nicht alle Spalten, die Spalten 7,8,9,14,15,19 und 28 sollten schon reichen, also 7 Spalten mal knapp 9.5 Mio. Zeilen. Die Spalte mit dem Datum und der Zeit würde ich dann auch noch splitten wenn möglich. Von den genannten Spalten ist nur die 28 (ID) numerisch so viel ich weiss.
Ich habe leider noch die 32 bit Version auf Windows, ich glaube dadurch ist das Process Limit auf 2 GB beschränkt wenn ich mich nicht täusche.

Es kommen schon Wiederholungen vor, aber die eine Spalte (28.) ist die ID, also eindeutig zuweisbar.

Viele Grüsse
rekcat
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: 22.07.2015, 18:43     Titel:
  Antworten mit Zitat      
Hallo,

es ist kein Anhang vorhanden.
Bei diesen Datenmengen wäre es schon sehr sinnvoll, in einen entsprechenden Rechner zu investieren.

... und versuch doch mal die bereits genannten Vorschläge. Mit * vor dem Identifier kann man etwas überspringen (siehe auch Doku von textscan).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2015, 22:29     Titel:
  Antworten mit Zitat      
Bist Du denn sicher, dass Du wirklich alle Daten gleichzeitig im Speicher haben musst? Und bist Du sicher, dass Du sie alle gleichzeitig in Matlab haben musst? Das sind die Fragen, die man als allererstes beantworten sollte, bevor man in Hardware investiert oder eine funktionierende Software-Installation anfasst...

Bis jetzt ist mir noch kein Fall mit so vielen Datensätzen untergekommen, bei dem man wirklich alle Sätze zur gleichen Zeit im Speicher haben musste. Und wenn doch, dann war Matlab mal wieder der Universal-Hammer, weil alle Probleme irgendwie wie Nägel aussehen. Letztendlich waren die gewünschten Aufgaben (Sortieren, Datensätze, die bestimmte Kriterien erfüllen raussuchen und ähnliches) mit einer Datenbank deutlich einfacher und schneller lösbar.
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: 24.07.2015, 07:44     Titel:
  Antworten mit Zitat      
Vielen Dank für eure Antworten. Ah, ich dachte ich hätte ihn angehängt! Aber vorläufig ist es okay: Ich war gestern an der Uni und habe einen leistungsfähigeren Computer mit 64bit Version benutzt; Ich konnte ein paar ganze Spalten importieren, mit dem * vor dem identifier, bevor Matlab abgestürzt ist. Womöglich reicht das für die Berechnungen. Vielen Dank für eure Tipps!!

Ja, ich brauche wirklich so viele Daten; Ich muss sie nicht nur ordnen etc..muss Regressionen, Co-Integrationsanalysen etc. berechnen. Hoffe das klappt Rolling Eyes

Euch einen schönen Tag und bald einen guten Start ins Wochenende!!

Grüsse
rekcat
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: 24.07.2015, 08:23     Titel:
  Antworten mit Zitat      
Zitat:
Ich durchstöbere etwa seit einer Woche gefühlt alle Matlab Foren der Welt. Ich habe auch bereits viele Einträge mit ähnlichen Problemen und Lösungen gefunden, aber nicht hat bei mir geklappt:


Ich bin besorgt. Eine Woche Zeitverlust in einer Masterarbeit etc. ist verdammt viel. Was hat den der Betreuer gesagt? Kam keiner auf die Idee eine Supportanfrage bei MathWorks einzustellen?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 08:59     Titel:
  Antworten mit Zitat      
Erfahrungsgemäß vergeben Betreuer solche Themen, weil sie es selbst nicht in 10 Minuten hinbekommen haben :D Sei auf jeden Fall mutig und trau Dich, die Ideen Deines Betreuers in Frage zu stellen. Braucht der wirklich eine Regression auf 10 Mio. Datenpunkten? Welchen Erkenntniszugewinn verspricht er sich im Vergleich zu einer Regression auf 100.000 Punkten? Usw... Betreuer sind auch nur Menschen und nur weil jemand ein Thema vergibt, heißt das leider nicht immer, dass er wirklich weiß, was er will oder wie der Bearbeiter das umsetzen soll...

Kommt denn vielleicht eine intelligente Reduzierung in Frage? Datum UND Wochentag zu importieren muss ja nicht sein. Und das in jedem Datensatz das Wort "Deutschland" ausgeschrieben ist, muss auch nicht unbedingt sein. Falls das geht, würde ich die Daten mit fopen , fgetl , ... durchgehen, sinnvolle Reduzierungen vornehmen und zeilenweise in eine neue Datei schreiben. Sinnvolle Reduzierungsmöglichkeiten sehe ich im Beispiel eigentlich in jeder Spalte:
* "Deutschland" kann auch als "de" da stehen. Oder als Zahl, die Du später Deutschland zuordnen und als uint8 importieren kannst.
* Datum+Uhrzeit in Unixtime oder vergleichbares konvertieren
* Wochentag: unnötig, steckt im Datum.
* im Preis das Komma durch einen Punkt ersetzen, damit der beim Import direkt als Zahl erkannt wird

Vielleicht bekommst Du den Datensatz auf diese Weise so klein, dass Du ihn anschließend importiert bekommst.
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: 24.07.2015, 09:04     Titel:
  Antworten mit Zitat      
Ich habe erst gestern mit dem Betreuer telefoniert, ich kann jetzt mal mit dem IT Support der Uni abklären, ob ich meinen PC aufrüsten darf oder vllt. einen zur Verfügung gestellt bekomme für die Berechnungen Smile Ich dachte es sei irgendwie peinlich dem Betreuer zu sagen, dass ich die Daten nicht ins Matlab kriege; Ich dache es liege an einem Programmierungsfehler/schlechter Code etc..Wink
Ich bin echt beeindruckt von diesem Forum!
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: 24.07.2015, 09:09     Titel:
  Antworten mit Zitat      
Epfi, auch dir danke für deine Tipps! Ich versuch das Ding jetzt wirklich auf das Minimum zu reduzieren und den wirds schon irgendwie klappen! Smile hahaha ich weiss was du meinst, kann schon sein Wink Ja wenns nicht klappt, werde ich weniger Daten nehmen müssen, aber da wir die (wertvollen) Daten schon haben, würden wir sie auch gerne benutzen. Mal schauen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 10:10     Titel:
  Antworten mit Zitat      
Meine Devise lautet da eher: lieber mit Intelligenz an ein Problem herangehen, als mit dem großen Hammer so lange draufschlagen, bis es endlich aufgibt ;) Und nicht selten benötigt man diese irrsinnige Genauigkeit ja auch gar nicht, weil das Modell, das man damit füttert sowieso das gar nicht so genau abbilden kann...

Auch wenn ich keine Ahnung von Finanzzeug habe: Sind vielleicht die schnellen Änderungen gar nicht relevant sondern nur Änderungen, die im Bereich von Stunden stattfinden? Dann könnte man die Zahlenwerte durch ein Tiefpassfilter schicken und anschließend mit kleiner Frequenz abtasten, so dass man die Datenmenge reduziert hat.
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, 14:34     Titel:
  Antworten mit Zitat      
Hallo,

ich würde erst mal hingehen und sehen, was zu gewinnen ist, wenn man die Daten effizient importiert. Dazu gehört vor allem auch ein sinnvolles Format.
Datumsangaben oder Zahlen als Strings zu importieren verschwendet sehr viel Speicher. Das sollte man also möglichst vermeiden.
Selbst wenn Strings wiederholt auftreten, kann man viel sparen, indem man sie direkt als Categorical importiert. Wenn du einen kleinen Datensatz zur Verfügung stellst, kann ich mir das gerne mal anschauen und auch den Vergleich liefern.

Grüße,
Harald
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: 24.07.2015, 15:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe. Ich lege gerne in File in den Anhang (Hoffe es klappt!). Die Spalten, die ich ganz sicher brauche, sind folgende: H,I,O,S (S muss ich im Matlab dann noch splitten). Allenfalls kommen noch 1-2 weitere dazu, hoffe aber nicht Wink

Grüsse

Beispielzeilen.rar
 Beschreibung:

Download
 Dateiname:  Beispielzeilen.rar
 Dateigröße:  9.17 KB
 Heruntergeladen:  443 mal
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:22     Titel:
  Antworten mit Zitat      
eine möglichkeit ist wie gesagt gleich das einlesen mit weglassen.
Code:
fid = fopen('Beispielzeilen.csv');
format=[repmat('%*s',1,7),'%s%s',repmat('%*s',1,5),'%s',repmat('%*s',1,3),'%s',repmat('%*s',1,9)];
Data=textscan(fid,format,'delimiter',';','headerlines',1)
fclose(fid)
 

oder zeilenweise mit umrechnung der werte.
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;
while ischar(tline)
    tline2=textscan(tline,format,'delimiter',';');
    Data{1}(k)=tline2{1};
    Data{2}(k)=tline2{2};
    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)

das braucht zb nur noch die hälfte speicherda die zahl und das datum von string in double umgewandelt werden. allerdings wäre das bei 10mio elementen immernoch 2.4 gb ram ca. und damit für dich nicht nutzbar. man müsste dazu halt noch das DE in eine zahl umwandeln wie bereits vorgeschlagen wurde. damit wären es dann nur noch 185 mb ram.
mit der lösung von harald mittels categorical kann ich leider nicht dienen das kenn ich nicht Smile darum bin ich da auch schon gespannt drauf.
grüße
_________________

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