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

转载于:https://www.cnblogs.com/crossing/p/4027463.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值