Я думаю о записи данных в файл. У кого-либо есть пример того, как записать большой объем данных в файл?
Править: Большинство элементов в матрице, обнуляет, другие uint32
. Я предполагаю самое простое save()
и load()
работал бы, как @Jonas предложенный.
Думаю, никто не видел правки, касающейся нулей :)
Если это в основном нули, вам следует преобразовать вашу матрицу в ее разреженное представление и затем сохранить ее . Вы можете сделать это с помощью функции sparse .
z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z
Name Size Bytes Class Attributes
z 10000x10000 800000000 double
Name Size Bytes Class Attributes
z 10000x10000 40016 double sparse
Я не думаю, что разреженная реализация предназначена для обработки uint32
.
Как генерируются данные? Как вам нужно получить доступ к данным?
Если я правильно подсчитал, переменная будет меньше 200 МБ, если все будет в два раза больше. Таким образом, вы можете легко сохранить и загрузить его как один файл .mat, если вам нужно получить к нему доступ только из Matlab.
%# 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')
Если вы хотите, чтобы размер файла данных был как можно меньше, вот несколько предложений:
Вот несколько примеров для иллюстрации:
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
Файлы, созданные выше, будут сильно отличаться по размеру. Размер файла 'data_double.dat'
будет около 131 073 КБ, 'data_uint8.dat'
будет около 16 385 КБ, а 'data_sparse.dat'
будет иметь размер менее 2 КБ.
Обратите внимание, что я также записал размеры данных \ векторов в файлы, чтобы данные можно было прочитать (используя FREAD ) и правильно изменить их форму. Также обратите внимание, что если бы я не предоставил аргумент 'double'
или 'uint8'
для FWRITE , MATLAB был бы достаточно умен, чтобы выяснить, что это не так. t необходимо использовать двойную точность по умолчанию и использовать только 8 бит для записи значений данных (поскольку все они равны 0 и 1).