2016-08-01 11 views
0

Ich habe eine 300MB ASCII-Datei mit 9 Spalten von Daten (Tab-getrennt, Zeichenfolgen und Zahlen). Ein Beispiel ist unten angegeben Linie:Laden Sie ASCII-Dateien in Matlab und speichern Sie sie als .mat

11204226 736539,402697000 192.168.0.104 10,0324 0 1,1313 3,543 3 9

Die Datei gut strukturiert ist und keine Leerzeilen oder fehlerhafte Linien sollten vorhanden sein. Das Format bleibt in der gesamten Datei gleich.
Wenn ich versuche, die Datei in Ubuntu 14.04 zu laden (ImportData). LTS, 6GB RAM, Matlab 2015b friert das System einfach ein. Mein Kollege hat die Datei erfolgreich in Windows 7, 8GB RAM, Matlab 2014b geladen.

Der Plan war jedoch, die Daten in einer .mat-Datei zu speichern, und er kann dies auch nicht tun. Eine Datei wird erstellt, aber die Größe erhöht sich auf über 1 GB, ohne dass jemals ein Ende erreicht wird.
I versucht, die Daten über die graphische Schnittstelle oder den folgenden Code geladen:

tdata = importdata('data.dat'); 

.mat die Datei als auch über die Schnittstelle Grapical versucht wurde, zu speichern.
Ich nahm an, dass eine 300MB-Datei keine solche Herausforderung darstellen sollte.
Welchen Ansatz würden Sie wählen, um mit der Datei umzugehen?
Ich erwartete, dass die .mat-Datei kleiner als die einfache ASCII-Datei ist.
Außerdem war mein Plan, die Originaldatei nicht in winzigen Teilen aufzuteilen.

UPDATE:
Mein Kollege, der in der Lage war, die Daten zu laden, konvertierte alle String-Einträge in der Struktur in Zahlen. Dies waren die ersten drei Spalten. Abgesehen von der dritten Spalte, die aus IP-Adressen besteht, bin ich mir nicht sicher, warum sie trotzdem als Strings importiert wurden. Mit einer All-Number-Matrix können die Daten gespeichert werden und die resultierende .mat-Datei hat eine Größe von 15 MB. Irgendwie hat der Mix aus Streichern und Zahlen alles vermasselt. Ich weiß immer noch nicht warum.

+2

Nun, Dateigröße sollte kein Problem sein - ich habe in über 10 GB Datei zuvor geladen, und auch wenn der RAM kann nicht passen - Matlab wird es trotzdem zwischenspeichern. Das Problem, das ich vermute, könnte Ihr Code sein - also editieren Sie bitte Ihre Frage und stellen Sie sie auf. – GameOfThrows

+2

Die meisten "automatischen" Importroutinen kämpfen oder ersticken in der dritten Spalte (IP-Adresse, 4 Zahlen getrennt durch 3 '.', was keinem 'numerischen' Standard entspricht). Ich würde die Verwendung von ['textscan'] (http://mathworks.com/help/matlab/ref/textscan.html) empfehlen, um Ihre Daten zu importieren, wenn sie Felder/Spalten unterschiedlichen Typs haben. – Hoki

Antwort

0

Ich öffnete große csv-Dateien (ca. 700 MB) in meinem letzten Projekt. Zuerst benutzte ich xlsread, fand aber einige Einschränkungen davon (Ich kann Dateien nicht öffnen besteht aus mehr als 1 Million Zeilen und diese Funktion benötigt viel Zeit). So fand ich sehr nützliche textscan Funktion. Hier ist das Beispiel mit Datenprobe ähnlich wie Ihr Beispiel:

Mein csv Beispiel:

11204226 736539.402697001 192.168.0.101 10.0321 1 1.1311 3.543 3 9 
11204333 736539.402697002 192.168.0.102 10.0322 2 1.1312 3.543 3 9 
11204444 736539.402697003 192.168.0.103 10.0323 3 1.1313 3.543 3 9 

Mein Code:

fileID = fopen('newfile.csv','r'); 

formatSpec1 = '%f%f%f%f%f%f%f%f%f%f%f'; 
A = textscan(fileID, formatSpec1,'Delimiter',{';'}); 

Ergebnis: A ist ein Zellenfeld. Jede Zelle von A enthält eine ganze Spalte von Daten. Was können wir für die IP-Adresse tun? Ich schlage vor, auf diese Weise zum Beispiel:

myip = strcat(num2str(A{3}),'.',num2str(A{4}),'.',num2str(A{5})) 

myip = 

192.168.0.0.101 
192.168.0.0.102 
192.168.0.0.103 

myip ist ein char-Array. Was ist mit dem Speichern all dieser Daten? Wir können zu Doppel Array-Zellen-Array umwandeln und entfernen ip Spalten:

res = cell2mat(A); 
res(:,3:5) = []; 

speichern jetzt:

save('test.mat','res','myip') 

Mit Matte Datei ist wirklich gute Idee, weil es nun von nützlichen Datentypen bestehen, können wir laden es mit einem Klick (oder 1 Zeile Befehl) und es ist viel schneller als CSV jedes Mal zu lesen.

+0

Vielen Dank für Ihre Annäherung! Ich konnte die Daten erfolgreich laden und in einer .mat-Datei speichern. – Green