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

Matlababsturz beim importieren von großer txt file

 

Apflne
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2015, 15:01     Titel: Matlababsturz beim importieren von großer txt file
  Antworten mit Zitat      
Hallo zusammen,

mein Problem ist, dass Matlab abstürzt wenn ich eine 470mb große Textfile importieren möchte mit
Code:
d = importdata('messwerte.txt');


Allerdings funktioniert es mit einer 240mb großen Textfile mit gleichem Aufbau einwandfrei.
Ich nutze R2014b, Win 7 64Bit.
>> memory
Maximum possible array: 12082 MB (1.267e+10 bytes) *
Memory available for all arrays: 12082 MB (1.267e+10 bytes) *
Memory used by MATLAB: 885 MB (9.275e+08 bytes)
Physical Memory (RAM): 7963 MB (8.350e+09 bytes)

Woran könnte das liegen?

Grüße
Apflne
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: 26.10.2015, 15:44     Titel:
  Antworten mit Zitat      
Hallo,

was genau heißt "abstürzt"? Bekommst du eine Fehlermeldung, oder stürzt MATLAB komplett ab? Wie sieht die Speicherauslastung aus?

Bei importdata versucht MATLAB zu erkennen, welche Struktur die Daten haben. Insbesondere bei so großen Datenmengen wird es deutlich effizienter sein, wenn du die Datenstruktur vorgibst, z.B. mit textscan . Falls es um tabellarische Daten geht, ist es häufig einfacher, mit Tables zu arbeiten ( readtable zum Importieren).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2015, 16:50     Titel:
  Antworten mit Zitat      
Hallo,

der Speicher wird komplett ausgelastet (8GB) und danach hängt sich der ganze PC auf, sodass ich ihn neu starten muss.
Bei der kleineren Texfile wird es genau auf die richtige Struktur gebracht die ich haben möchte. Deshalb wäre es gut wenn ich weiterhin die datei mit "importdata" importieren könnte, da ich anschließen nach dem importieren nach bestimmten Strings suche.
Gibt es irgendwelche Maßnahmen, damit das funktioniert?

Grüße
Apflne
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: 26.10.2015, 17:54     Titel:
  Antworten mit Zitat      
Hallo,

klingt danach, als ob der Rechner zu swappen anfängt.
Entsteht das Problem bereits beim Importieren oder erst beim Verarbeiten der Daten?

Wieviel Speicher wird denn bei der 240 MB-Datei verbraucht?

Zitat:
Deshalb wäre es gut wenn ich weiterhin die datei mit "importdata" importieren könnte,

readtable wäre im einfachsten Fall genau eine Zeile. Wenn man mit sehr großen Dateien arbeitet, ist es eben empfehlenswert, auch besonders dafür geeignete Funktionen zu verwenden.

Zitat:
da ich anschließen nach dem importieren nach bestimmten Strings suche.

Wenn eine oder mehrere Spalten Strings sind und diese wiederholt auftauchen, kann die Verwendung von categorical Arrays sehr viel Speicher sparen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2015, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

beim importieren nach 4-5 Sekunden etwa hängt sich der PC auf wenn der Arbeitspeicher voll wird.
Bei der 240MB-Datei benötigt er 4GB Speicher.
Habe es mit
Code:
a = readtable('messdaten.txt');

versucht, aber hängt sich genauso auf.
Kann leider die messdaten nicht als binär datei speichern.
Gibt es sonst noch eine möglichkeit die txt-datei zu importieren ohne einen größeren Speicher einbauen zu müssen?

Danke dir für deine Hilfe!!

Grüße,
Apflne
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: 27.10.2015, 16:24     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Bei der 240MB-Datei benötigt er 4GB Speicher.

Das lässt vermuten, dass die Daten ineffizient im Speicher repräsentiert werden.

Kannst du einen kleinen Dateiausschnitt (~1000 Zeilen) posten, damit man die Dateistruktur versteht?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 13:29     Titel:
  Antworten mit Zitat      
Hallo,

im Anhang ist der Anfang der Textdatei zu sehen.
_Parameterbezeichnung
-Einheit
-Zahlenwerte

Die Zahlenwerte gehen noch um einiges weiter...

Grüße,
Apflne

gomatlab.txt
 Beschreibung:

Download
 Dateiname:  gomatlab.txt
 Dateigröße:  246.61 KB
 Heruntergeladen:  441 mal
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: 28.10.2015, 13:59     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das richtig sehe, hat die Datei 4000+ Spalten. Die header-Information wiederholt sich extrem oft, und das verschwendet natürlich Speicher.

Welche Informationen brauchst du denn aus so einer Datei?

Wird bei größeren Dateien "nur" die Anzahl der Zeilen größer oder auch die Anzahl der Spalten?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

die Header-Informationen (Spalten) sind fix und werden nicht größer. (4914 Spalten)
Zitat:
Welche Informationen brauchst du denn aus so einer Datei?

aus dieser Datei brauch ich nur ca. 40 Spalten die, die ich vorher finden muss und in eine neue Matrix bzw. Textdatei schreiben will.
Zitat:
Wird bei größeren Dateien "nur" die Anzahl der Zeilen größer oder auch die Anzahl der Spalten?

Die vollständige Datei hat nur eine größere Anzahl von Zeilen (12000), bei 4914 Spalten.
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: 28.10.2015, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aus dieser Datei brauch ich nur ca. 40 Spalten die, die ich vorher finden muss und in eine neue Matrix bzw. Textdatei schreiben will.

D.h. es ist gar nicht nötig, die gesamte Datei einzulesen.
Nach welchen Kriterien werden die ca. 40 Spalten denn ausgewählt?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 14:47     Titel:
  Antworten mit Zitat      
Hallo,

es ist nicht nötig die gesamte Datei einzulesen.
Es sind nur bestimmte Header/Spalten einzulesen die bestimmte Strings beinhalten wie zb."Vdy_vVehicle".
Ist das möglich?

Grüße,
Apflne
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: 28.10.2015, 15:21     Titel:
  Antworten mit Zitat      
Hallo,

hier mal ein Versuch:

Code:
fid = fopen('gomatlab.txt');
caseNumber = fgetl(fid);
headers = textscan(fid, '%s', 4914, 'HeaderLines', 1, 'Delimiter', '\t');
headers = headers{1};

units = textscan(fid, '%s', 4914, 'Delimiter', '\t');

relevant = cellfun(@(str) ~isempty(strfind(str, 'Vdy_vVehicle')), headers);
relevant = relevant+1; % 1 - Spalte kann übersprungen werden, 2 - Spalte wird gebraucht

choices = {'%*f', '%f'};
pattern = choices(relevant);
pattern = [pattern{:}];

data = textscan(fid, pattern, 'Delimiter', '\t');
data = cell2mat(data{1});


Im vorliegenden Fall klappt das nicht, da die 2. Zeile mit Zahlen deutlich kürzer ist als die 1. - ich vermute mal, das liegt nur an dem Datenausschnitt hier?

Welche MATLAB-Version hast du? Wenn es R2014b oder älter ist, geht das mit dataStore evtl. eleganter.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2015, 11:57     Titel:
  Antworten mit Zitat      
Hallo,

vielen dank für deinen Versuch!!! Smile
Funktioniert zwar, aber bei anderen Messdaten, welche eine andere Anzahl an Headers haben, müsste man den Code jedes mal anpassen?!
Habe die Version 2014b. Wie würde es denn mit dataStore funktionieren?
Anbei noch die vollständige Text-Datei(Komma-getrennt).

Grüße,
Apflne
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: 30.10.2015, 12:17     Titel:
  Antworten mit Zitat      
Hallo,

das mit dem Anhang hat nicht geklappt.

Wenn die Anzahl der Gesamtspalten nicht vorab bekannt ist, würde ich die erste Zeile einlesen und die Anzahl der Trennzeichen zählen:
Code:
fid = fopen('gomatlab.txt');
caseNumber = fgetl(fid);
fgetl(fid); % Leerzeile
headers = fgetl(fid);

% 9 ist ASCII-Code von Tabulator
numCols = nnz(uint8(headers) == 9) + 1; % das dann statt 4914
frewind(fid)


Vergessen hatte ich übrigens, dass man die Datei auch wieder schließen sollte:
Code:



Mit datastore:
Code:
ds = datastore('gomatlab.txt', 'Delimiter', '\t',...
    'NumHeaderLines', 2);

headers = ds.VariableNames;
relevant = cellfun(@(str) ~isempty(strfind(str, 'Vdy_vVehicle')), headers);

ds.SelectedVariableNames = headers(relevant);

data = readall(ds);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2015, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

mit datastore zeigt er mir folgenden Fehler an:

Code:
ds = datastore('gomatlab.txt', 'Delimiter', '\t','NumHeaderLines', 2);
Warning: Characters can not be used in both whitespace and delimiter lists.
Removing delimiter chars from whitespace list.
 
Error using datastore (line 114)
Cannot detect TextscanFormats from
...\gomatlab.txt.


Was stimmt wieder nicht? Rolling Eyes

Grüße,
Apflne
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 - 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.