使用matfile部分额外数据仍然会将整个文件加载到内存中

3个视图(过去30天)
贾斯汀布鲁克斯
贾斯汀布鲁克斯 2021年4月8日
你好
我有一个。mat文件以-7.3格式保存。文件的内容是一个大单元格数组。我使用(,)索引检索单行:
obj=matfile(“File.mat”);
Data=obj.ray(RowNum,:);
我已经对内存使用情况做了一些调查,当我运行该命令时,它工作了,我从单元格数组中取出了行。
然而,它花费了与将.mat文件加载到工作区中相同的时间,并且使用了相同数量的内存。从MATLAB帮助文件中,我认为这种语法被设计为只部分加载文件到内存中。是我做错了什么,还是这个功能没有按照我希望的方式工作?
谢谢你的帮助。
3评论
dpb
dpb 2021年4月8日
我想,对于单元阵列,我并不感到非常惊讶,因为它可能必须取消对它们的引用才能把东西拿出来——因此,虽然它返回的只是要求的东西,但它需要付出相同或更多的努力,而不仅仅是直接加载,然后清除不需要的东西。
在直数组中,可以计算直接位置,并在缓冲区上调用memcopy(),这样就可以简化内容;我不知道单元格数组的实际内存结构是什么,但它们的内部从未涉及过,但是与之相关的开销很大,表在其上又增加了一层。

登录评论。

答复(2)

马特·J
马特·J 2021年4月9日
编辑:马特·J 2021年4月9日
我们可以在这里进行测试。下面的一个说明了这有一些好处,尽管考虑到加载的数据的大小,可能没有我预期的那么多好处。你确定你的 File.mat 是v7.3吗?
CellArray(1:10 0, 1:10 0) ={兰德(50)};
拯救-v7.3文件系统
抽搐;
L=负载(“文件”);
toc
运行时间为2.161086秒。
obj = matfile (“File.mat”可写的,假);
抽搐
obj.CellArray(20日);
toc
运行时间为0.587641秒。
1评论
贾斯汀布鲁克斯
贾斯汀布鲁克斯 2021年4月9日
我进行了以下测试:
fid=fopen(“testpartialoadcell.mat”);
txt=字符(fread(fid,[1,40],“*字符”));
txt = (txt, 0);
txt=txt(1:find(txt==0,1,“第一”)-1);
结果是:
'MATLAB 7.3 MAT-file, Platform: PCWIN64, Created on: Thu Apr 8 08:50:48 2021 HDF5 schema 1.00'
然后在偏单元格数组上运行以下代码(减少了真实数据集的行数,但数据是相同的):
抽搐;
负载(“testpartialoadcell.mat”
toc
大小(EventCell)
清楚的全部的
抽搐;
obj=matfile(“testpartialoadcell.mat”
toc
抽搐;
测试= obj.EventCell(46岁);
toc
控制台的输出为:
1.871945秒%加载整个文件到工作区
80年,3%单元格数组的大小
1.824823秒创建matfile对象
3.131165秒单列牵引%
我还对整个数据文件进行了相同的测试,只是为了查看。控制台的输出为:
280.921421秒%加载整个文件到工作区
5421年,3%单元格数组的大小
279.005530秒创建matfile对象
624.437779秒单列牵引%
我还观察了内存使用情况,到处都是,但每次操作的峰值都是相同的内存量。现在,在创建对象并拉出一行时,内存下降了,但这是整个练习的重点,首先是尝试减少内存使用量和终端用户的时间。
所以我不认为它适用于我的申请,这很好。还有其他方法可以完成同样的任务,只是没有那么“花哨”。
谢谢!

登录评论。


斯蒂芬。
斯蒂芬。 2021年4月9日
编辑:斯蒂芬。 2021年4月9日
转置单元格数组(当它创建时),以便您访问单元格数组的连续部分:
Data=obj.ray(:,ColNum);
%^^^^^^^^^第一个索引是冒号!

下载188bet金宝搏


释放

R2020b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!