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

comma2point - OUT OF MEMORY

 

lukel
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.02.2016, 13:53     Titel: comma2point - OUT OF MEMORY
  Antworten mit Zitat      
Hi,

ich habe eine Text-Datei in der ich die Komma's zu Punkten umwandeln möchte.
Dazu habe ich hier im Forum diese Funktion gefunden:

Zitat:

Code:

 function comma2point(File)
% Generate a new file named Oldfilename_Modified.ending. In the new File all
% ',' are changed to '.' Needs a full datapath and filename as input.
   
    Name=textscan(File,'%s%s','delimiter','.');
    NewFile=strcat(Name{1}, '_Modified.',Name{2});
    copyfile(File, NewFile{1});
    file    = memmapfile(NewFile{1},'Writable',true);
    comma   = uint8(',');
    point   = uint8('.');
    file.Data(( file.Data==comma)' ) = point;
 %   delete(file)
end
 



Quelle:http://www.gomatlab.de/anfaenger-versucht-txt-daten-einzulesen-t373.html#11054

Die Funktion funktioniert super und schnell für kleinere Dateien (6 MB - 167.000 Zeilen; 4 Spalten)
Wenn ein Versuch mehrere Stunden läuft entstehen aber auch Dateien mit deutlich mehr Zeilen. Ich habs mit einer mit 2.500.000 Zeilen probiert, da kommt dann folgende Error-Meldung:

Code:

Error using vertcat
Out of memory. Type HELP MEMORY for your options.

Error in memmapfile>hSubsasgnIndexOutOfRange (line 987)
            Imax = max([0; find(I(:))]);

Error in memmapfile/hParseNumericDataSubsasgn (line 392)
                if hSubsasgnIndexOutOfRange(LHS, s(2).subs) || ...

Error in memmapfile/hDoDataSubsasgn (line 484)
            [valid, s, newval] = hParseNumericDataSubsasgn(obj, s, newval);

Error in memmapfile/subsasgn (line 739)
                hDoDataSubsasgn(obj, s, newval);

Error in comma2point (line 11)
    file.Data(( file.Data==comma)' ) = point;

Error in A_test (line 4)
comma2point('specimen_groß.dat');
 


Hat jemand eine Idee zur Lösung des Problems?

Wie wäre es zum Beispiel die Datei in kleinere Blöcke zu zerlegen und die einzeln durch comma2point zu schicken. Da weiß ich aber nicht wie man das mit recht kurzer rechenzeit machen könnte.

MfG lukel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.02.2016, 14:01     Titel:
  Antworten mit Zitat      
Hallo,

du kannst das ja innerhalb comma2point machen, indem du mit memmapfile nicht die ganze Datei auf einmal mappst, sondern blockweise. Die relevanten Parameter sind 'Offset' und 'Repeat'.

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: 26.02.2016, 14:03     Titel:
  Antworten mit Zitat      
wie groß ist denn die datei und verwendest du 64 bit matlab oder 32 bit ?
_________________

richtig Fragen
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: 26.02.2016, 14:05     Titel:
  Antworten mit Zitat      
Ich habe mal das hier geschrieben, vielleicht ist das besser beim Thema Speicher: http://www.mathworks.com/matlabcent.....o-replace-commas-with-dot

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
lukel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.02.2016, 15:15     Titel:
  Antworten mit Zitat      
Danke für die vielen Antworten!!

@Harald

ich hab in der Hilfe nicht ganz verstanden was die Parameter machen.

Bei Repeat geht er nur die Anzahl von Zeichen weit, die man bei Repeat angibt?
Wenn ich da eine Zahl über 30.000.000 wähle kommt wieder ein OUT OF MEMORY ... bis dahin wurde dann bei 700.000 zeilen das Komma ersetzt

Was 'Offset' macht verstehe ich noch weniger ... die Zahl die man da angibt ist die Anzahl an Bytes bis er mit dem mappen startet?
Da weiß ich nicht wie ich das benutzen soll und wenn ich die Zahl ändere passiert nix.

PS.: Was ist eigentlich eine Memory Map?




@ Winkow

also zuhause müsste ich eine 64-Bit Version haben, allerdings wäre es schön wenn es auch in der Uni auf 32-Bit laufen würde.

Ich meine die größten Dateien sind so um 1 GB groß, kann ich aber erst heute abend mit Gewissheit sagen.



@Andreas Goser

Mit deinem Skript hab ich leider das gleiche Problem, dass es größere Dateien nicht schafft


MfG lukel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Wenn ich da eine Zahl über 30.000.000 wähle kommt wieder ein OUT OF MEMORY

Dann musst du eine kleinere Zahl wählen.

Zitat:
Was 'Offset' macht verstehe ich noch weniger ... die Zahl die man da angibt ist die Anzahl an Bytes bis er mit dem mappen startet?

Genau. Mit 'Repeat' 100000 würdest du also z.B. in einer Schleife 'Offset' über 0, 100000, 200000, etc. laufen lassen und so Bytes 1-100000, 100001-200000, 200001-300000 etc. bearbeiten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.02.2016, 15:37     Titel:
  Antworten mit Zitat      
Das klappt schon mal.

Sieht jetzt so aus

Code:

 function comma2point(File)
% Generate a new file named Oldfilename_Modified.ending. In the new File all
% ',' are changed to '.' Needs a full datapath and filename as input.
   
    Name=textscan(File,'%s%s','delimiter','.');
    NewFile=strcat(Name{1}, '_Modified2.',Name{2});
    copyfile(File, NewFile{1});
    for i=0:2000
        Off=100000*i;
    file    = memmapfile(NewFile{1},'Repeat',100000,'Offset',Off,'Writable',true);
    comma   = uint8(',');
    point   = uint8('.');
    file.Data(( file.Data==comma)' ) = point;
    end
%     delete(file)

end
 


Wenn ich die for-Schleife i=0:10 setzte läuft alles.
Problematisch wird es wenn ich die ganze Datei einlesen möchte. Zum Beispiel mit i=0:2000 komme irgendwann ans Ende der Datei (was ich ja auch möchte). Dann erscheint wieder ein Error, dass mein NewFile nicht groß genug ist (was ja auch der Fall ist).
Wie kann ich beim letzten Byte abbrechen lassen?

Code:
Error using memmapfile/hCreateMap (line 307)
File "D:\test\03\specimen_gross_Modified2.dat" is not large enough to map with the current format, offset, and repeat values.

Error in memmapfile/subsref (line 779)
                    hCreateMap(obj);

Error in comma2point (line 13)
    file.Data(( file.Data==comma)' ) = point;

Error in A_test (line 4)
comma2point('specimen_gross.dat');
Private Nachricht senden Benutzer-Profile anzeigen
 
lukel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.02.2016, 15:47     Titel:
  Antworten mit Zitat      
Oder ich müsste irgendwie beim Start der Funktion rausfinden wieviele Bytes die Text-Datei hat und die schleife dann anpassen?

Gibt es eine Funktion die die Größe in Bytes einer Datei ausgibt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
fileinfo = dir(filename);
numBytes = fileinfo.Bytes;

'Repeat' könnte dann auf etwas wie
Code:
max(numBytes - Offset, 100000)
gesetzt werden.

Hinsichtlich Effizienz: es sollte möglich sein, eine bestehende Map zu verschieben statt jedes Mal neu zu setzen.
memmapfile also außerhalb der Schleife, und in der Schleife dann file.Offset aktualisieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 29.02.2016, 08:02     Titel:
  Antworten mit Zitat      
Vielen Dank, klappt jetzt!

Ich bin immer wieder erstaunt das hier einige so viele matlab Funktionen kennen Very Happy
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 - 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.