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

posted @ 2014-10-15 21:58  kevinTien  阅读(1297)  评论(0编辑  收藏  举报