MATLAB基础知识之内存映射
如果我们的文件太大而不能一次性加载进内存,我们可以创建一个memmapfile对象,这样可以将原始数据当做数组一样来访问,并且同样的通过下标访问数据。
用MNIST数据()举个例子:
[Xtrain, ytrain, Xtest, ytest] = setupMnist('keepSparse', false);
whos('Xtrain', 'ytrain', 'Xtest', 'ytest');
结果:
Name Size Bytes Class Attributes Xtest 10000x784 62720000 double Xtrain 60000x784 376320000 double ytest 10000x1 80000 double ytrain 60000x1 480000 double
下面呢,我们把数据存储类型修改为int16和int8,因为double数据类型访问速度要比int类型的慢,而且需要内存更多。。
fname = fullfile(tempdir(), 'mnist.dat');
fid = fopen(fname, 'w');
fwrite(fid, Xtrain, 'int16');
fwrite(fid, ytrain, 'int8');
fwrite(fid, Xtest, 'int16'); % max int16 value is 32767
fwrite(fid, ytest, 'int8'); % max int8 value is 127
fclose(fid);
好,现在我们在临时文件夹中创建了一个mnist.dat文件。
mmap = memmapfile(fname, 'Writable', true, 'Format', ... {'int16', size(Xtrain), 'Xtrain'; 'int8', size(ytrain), 'ytrain'; 'int16', size(Xtest), 'Xtest'; 'int8', size(ytest), 'ytest'; });
创建一个memmapfile文件,memmapfile函数的使用:
现在我们可以访问这个数据了:
tic X4000 = mmap.Data.Xtrain(4000, :); % 1x784 y4000 = mmap.Data.ytrain(4000); toc
我们发现需要的时间为
Elapsed time is 0.315341 seconds.
但是一旦把这块数据加载到内存了,再访问一次
发现时间变为
Elapsed time is 0.004710 seconds.
好了,现在我们可以像一般数据一样来操作这个数据;
例如赋值:
mmap.Data.Xtrain(1, 30:35) = 255;
求均值:
xbar = mean(mmap.Data.Xtest, 2);
最后别忘记clear该块数据
clear mmap
delete(fname);
Reference:
http://ubcmatlabguide.github.io/html/files.html