Matfile和一半低效的存储
23次浏览(过去30天)
显示旧的注释
亲爱的MATLAB用户:
我遇到过以下存储效率低下的问题:
删除(“myfile.mat”)
句柄= matfile(“myfile.mat”)
句柄。X= half(X);% X很大
句柄。Y =一半(Y);% Y很大
句柄。A = A;
句柄。B = B;
%%%我的文件大小。垫子为2.4Gb %%% %
数据=负载(“myfile”);
保存(“mynewfile1.mat”,“-v7.3”,“结构”,“数据”)
%%% mynewfile1的大小。垫为1.2Gb %%%
数据=负载(“myfile”);
保存(“mynewfile2.mat”,“结构”,“数据”)
%%% mynewfile2的大小。垫为1.2Gb %%%
是什么原因导致存储空间增加了一倍,我如何在不加载和保存文件的情况下避免这种情况。
更新:这个问题似乎不是由-v7.3标志引起的。我更新了上面的代码来显示这一点。
谢谢你的帮助。
30的评论
dpb
2021年7月24日
医生里有张纸条
“版本”
表示——的命名参数
7.3版mat文件使用基于HDF5的格式,需要一些开销存储来描述文件的内容。对于单元格数组、结构数组或其他可以存储异构数据类型的容器,Version 7.3 mat文件有时比Version 7 mat文件大。”
放大是我在其他Q?在过去的几个月里——就在前几天有另一个对话,似乎一个文件也保存在w/ -v7.3标志的2X大小,但是
保存
命令w/o的旗帜是一半大小。原来-v7标志在初始安装时默认设置在首选项中。
似乎这需要TMW的一些注意-在大小上的巨大膨胀表明在实现中有一些不符合/预期的东西。
米卡
2021年7月24日
谢谢你的意见。我只是试图在没有-v7.3标志的情况下重新保存我的文件,得到了相同的结果。所以看起来,至少在这种情况下,问题不是由-v7.3标志引起的,而可能是由matfile?我将相应地更新问题。
dpb
2021年7月24日
很可能的;matifle对象必须有开销才能访问piece -parts。
或者,什么
一半
其实做什么?它是否创建了一些对象?我没有任何一家TBs,所以不确定。
为了检查,设置是什么
偏好——General-MAT-files
?这样我们就可以确定在命令行上没有显式标记的情况下使用了哪个版本。
dpb
2021年7月24日
默认值是-v7,两者都是
保存(“mynewfile1.mat”,“-v7.3”,“结构”,“数据”)
保存(“mynewfile2.mat”,“结构”,“数据”)
返回相同大小的文件显示不同的文件大小是
不
与版本相关
数据
实际上是。
现在,我们(至少是我,因为我不能测试)还不知道是什么
一半
实际上返回——上面的文档不清楚。
什么
x = (x)一半;
谁x
回报呢?
米卡
2021年7月24日
以下是我得到的答案:
>> X = rand(1000);
>> x =一半(x);
> >谁
的名字大小字节类属性
X1000 x10008000000双
x1000 x10002000000一半
沃尔特·罗伯森
2021年7月25日
但我需要matfile保存在parfor循环。
我没有看到任何保证,两个不同的进程写入同一个matfile()不会相互干扰。
为同时访问而设计的文件结构是memmapfile()。
米卡
2021年7月25日
在parfor循环中不能调用Save,
//www.tianjin-qmedu.com/help/parallel-computing/transparency.html
是的,我可以写一个单独的函数,但matfile是一个更优雅的解决方案,如果它工作如预期。
所以我想这是我主要关心的问题,matfile的意外行为(可能与half结合在一起)。
dpb
2021年7月25日
我们已经排除了所有关于大小的难题除了
matfile
的显式结果除外
保存
语句的一半对象(我不能测试)。到目前为止,我们已经证明它没有显示通过使用的额外内存
谁
但这并不能证明
保存
不需要额外的信息来配合。有人认为不是,但还没有得到证实。
如果性能是Q?就像我推测的那样
parfor
不管怎样,
matfile
解决方案在最小化源代码方面可能看起来很“优雅”,但我认为与建议的解决方案相比,即使没有文件大小问题,它仍然会花费相当大的时间。
dpb
2021年7月26日
我本以为结果会是这样的,但因为我不能测试,只是为了记录……:)
我同意,我认为这很值得引起他们的明确注意(尽管我认为他们已经意识到了这一点),因为他们似乎需要重新审视是什么导致了如此巨大的爆发,并重新思考他们下一步要做什么。
虽然他们可能不会将其归类为bug,因为它似乎仍然可以提供文档中的功能,但从实现的性能和质量角度来看,它确实值得标记。
dpb
2021年7月26日
这避免了它,但并没有解决存储需求显著增加的问题
matfile
在我看来,这至少是一个问题,即使在某些情况下可以通过不使用它来绕过它。如果永远不打算使用它,那么在语言中使用它没有什么意义……:)
詹姆斯Tursa
2021年7月27日
为了记录,一半的数据类型存储为不透明的classdef对象。它们与其他原生数字类型(如double和single)有本质上的不同。我不知道这是否和他的行为有关。
艾克Blechschmidt
2021年7月28日
您可以执行以下操作,并查看文件存储为hdf5文件的方式是否有所不同:
h5disp (“myfile.mat”);
h5disp (“mynewfile1.mat”);
米卡
2021年7月29日
谢谢,下面是mathworks support的提示:万博1manbetx
mat文件v7.3基于HDF5, HDF5不能有效地管理空闲空间。如果频繁地添加和写入HDF5文件中的数据集,文件可能会变得不必要地大。
正如您所演示的,一种可能的解决方法是使用“save”函数。这使得MATLAB可以更有效地压缩数据,因为没有重复写入MAT文件。请参阅此文档链接,特别是提示部分,了解如何以这种方式有效地存储到MAT文件:
米卡
2021年8月16日
只是为了跟进,这个小函数应该做的工作:
函数mysave(文件名,变长度输入宗量)
数据= struct(varargin{:});
保存(文件名,“-v7.3”,“结构”,“数据”);
结束
下面是一个用法示例:
%运行并检查结果
mysave (“myfile.mat”,“一个”, 1“b”2,“c”3);
谁- file myfile.mat
的名字大小字节类属性
一个1 x18双
b1 x18双
c1 x18双
Q490
2021年8月16日
作为旁注,并且不确定这是否与您的问题的答案直接相关,我发现一个非常有用的函数可以很好地替代使用matfile是“savefast”,由Tim Holy (
//www.tianjin-qmedu.com/matlabcentral/profile/authors/1337381
),并可于以下网址下载:
对于你所谈论的文件大小,它保存它非常快,在尽可能小的文件大小。我强烈推荐它。
答案(0)
发生错误
由于对页面所做的更改,无法完成操作。重新加载页面以查看其更新状态。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。