Frage

Ich denke, die Daten in eine Datei zu schreiben. Hat jemand ein Beispiel davon, wie eine große Menge von Daten in eine Datei zu schreiben?

Edit: Die meisten Elemente in der Matrix sind Nullen, andere sind uint32. Ich denke, die einfachste save() und load() funktionieren würde, wie @Jonas vorgeschlagen.

War es hilfreich?

Lösung

Ich denke, niemand die Bearbeitung über die Nullen gesehen:)

Wenn sie meist Nullen sind, sollten Sie Ihre Matrix auf seine spärliche Darstellung konvertieren und und speichern es. Sie können das tun mit der spärlich Funktion.

Code

z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z

Output

Name          Size                   Bytes  Class     Attributes

  z         10000x10000            800000000  double  

Name          Size               Bytes  Class     Attributes

  z         10000x10000            40016  double    sparse    

Ich glaube nicht, die spärliche Umsetzung Griff uint32 ausgelegt ist.

Andere Tipps

Wenn Sie mit dem Halten Sie die Größe der Datendatei so klein wie möglich betroffen sind, sind hier einige Vorschläge:

  • Schreiben Sie die Daten in eine Binärdatei (dh unter Verwendung von FWRITE ) statt in eine Textdatei (dh mit fprintf ).
  • Wenn Ihre Daten alle ganzzahligen Werte enthält, wandeln es in oder speichern Sie sie als mit oder ohne Vorzeichen integer-Typ anstelle des Standard double Präzisionsart MATLAB Anwendungen.
  • Wenn Ihre Daten enthält Gleitkommazahlen, aber Sie brauchen nicht die Reichweite oder die Auflösung des Standard double precision Typ , wandeln es in oder speichern sie sie als single precision Typ .
  • Wenn Ihre Daten ausreichend spärlich (dh es gibt viel mehr Nullen als Nicht-Nullen in der Matrix), dann können Sie die FIND Funktion die Zeilen- und Spaltenindizes der nicht-Null-Werte zu erhalten, dann nur speichern diese auf Ihre Datei.

Hier sind ein paar Beispiele zu veranschaulichen:

data = double(rand(16,2^20) <= 0.00001);  %# A large but very sparse matrix

%# Writing the values as type double:
fid = fopen('data_double.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');     %# Write the matrix size (2 values)
fwrite(fid,data,'double');           %# Write the data as type double
fclose(fid);                         %# Close the file

%# Writing the values as type uint8:
fid = fopen('data_uint8.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');    %# Write the matrix size (2 values)
fwrite(fid,data,'uint8');           %# Write the data as type uint8
fclose(fid);                        %# Close the file

%# Writing out only the non-zero values:
[rowIndex,columnIndex,values] = find(data);  %# Get the row and column indices
                                             %#   and the non-zero values
fid = fopen('data_sparse.dat','w');  %# Open the file
fwrite(fid,numel(values),'uint32');  %# Write the length of the vectors (1 value)
fwrite(fid,rowIndex,'uint32');       %# Write the row indices
fwrite(fid,columnIndex,'uint32');    %# Write the column indices
fwrite(fid,values,'uint8');          %# Write the non-zero values
fclose(fid);                         %# Close the file

Die Dateien, die oben erstellt werden drastisch in der Größe unterscheiden. Die Datei 'data_double.dat' wird etwa 131.073 KB sein, 'data_uint8.dat' über 16.385 KB sein und 'data_sparse.dat' wird weniger als 2 KB.

Beachten Sie, dass ich auch die Daten \ Vektorgrößen auf die Dateien geschrieben, so dass die Daten wieder eingelesen werden können (mit FREAD ) und neu geformt richtig. Beachten Sie auch, dass, wenn ich nicht ein 'double' oder 'uint8' Argument liefern FWRITE würde MATLAB intelligent genug sein, um herauszufinden, dass es nicht die Standard-Doppel Präzision zu verwenden brauchte und nur 8 Bit, die Datenwerte zu schreiben, verwenden würde (da sie alle 0 und 1).

Wie erzeugt die Daten? Wie müssen Sie die Daten zugreifen?

Wenn ich mich richtig zu berechnen, ist die Variable weniger als 200 MB, wenn es doppelt ist. So können Sie ganz einfach speichern und sie als eine einzige .mat Datei laden, wenn Sie es von Matlab nur zugreifen müssen.

%# create data
data = zeros(16,2^20);

%# save data
save('myFile.mat','data');

%# clear data to test everything works
clear data

%# load data
load('myFile.mat')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top