Verfasst am: 26.02.2016, 13:53
Titel: comma2point - OUT OF MEMORY
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.
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:
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.
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'.
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
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.
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)
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 (line307)
File "D:\test\03\specimen_gross_Modified2.dat" is not large enough to map with the current format, offset, and repeat values.
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.
Ich bin immer wieder erstaunt das hier einige so viele matlab Funktionen kennen
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
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.