如何不断把数写入数组matlab,性能 – 在MATLAB中将大型数组直接写入磁盘时,是否需要预先分配?...

问:增长数组应用性能是否相同,如果与写入磁盘的时间相比,是否重要?

答:是的,如果您在磁盘上大幅增长文件,而不预先分配,性能将会受到影响.表演打击将是分裂的后果.如您所提到的,如果文件是在一个会话中写入的,则碎片化风险较小,但如果文件显着增加,则会导致问题.

在MathWorks网站上提出了related question,接受的答案是尽可能的预先分配.

如果您不预先分配,则您的性能问题的程度将取决于:

>您的文件系统(数据如何存储在磁盘上,群集大小),

>您的硬件(HDD查找时间或SSD访问时间)

>你的mat文件的大小(无论是移动到不连续的空间),

>和当前的存储状态(现有碎片/可用空间).

假设你运行的是一个最近的Windows操作系统,所以使用NTFS file-system.我们进一步假设它已经设置了默认的4 kB的群集大小.因此,磁盘上的空间将在4 kB chunks中分配,并将这些位置索引到主文件表.如果文件增长,连续空间不可用,那么只有两个选择:

>将整个文件重新写入磁盘的新部分,其中有足够的可用空间.

>将文件分段,将附加数据存储在磁盘上的不同物理位置.

文件系统选择执行最不利的选项#2,并更新MFT记录以指示新集群在磁盘上的位置.

现在,硬盘需要物理移动读取头以读取或写入新的集群,这是一个(相对较慢)的过程.在移动头部,等待磁盘正确的区域旋转下来,您可能会看到about 10ms的搜索时间.因此,每次打碎片段时,都会有一个额外的HDD移动10ms延迟访问新数据.固态盘具有更短的寻道时间(无移动部件).为了简单起见,我们忽略了多盘系统和RAID阵列!

如果您不断增长文件,那么您可能会遇到很多碎片.这真的取决于文件的增长时间/多少以及使用硬盘的方式.您体验到的性能也将取决于您阅读文件的频率以及遇到碎片的频率.

MATLAB在Column-major order中存储数据,并且从评论看来,您有兴趣在数据集上执行列式操作(总和,平均值).如果这些列在磁盘上变得不连续,那么你将在每个操作上打出很多碎片!

如注释所述,读写操作将通过缓冲区执行.由于@ user3666197指出,操作系统可以推测读取磁盘上的当前数据,因为您可能希望下一个数据.如果硬盘空闲时,这种行为特别有用 – 保持其在最大容量下运行,并且在缓冲存储器中使用数据的小部分可以大大提高读写性能.然而,从你的问题,听起来好像你想在一个巨大的(太大的内存).mat文件上执行大的操作.鉴于您的用例,硬盘将无法正常工作,并且数据文件太大,无法适应缓冲区 – 所以这些特殊技巧将无法解决您的问题.

所以…是的,你应该预先分配.是的,在磁盘上增加阵列的性能将会适用.是的,这可能是重要的(这取决于细节,如增长量,碎片等).如果您要真正进入HPC精神,那么请停止您正在做的事情,扔掉MATLAB,分析数据并尝试像Apache Spark!但这是另一个故事.

这回答你的问题吗?

附:更正/修改欢迎!我是在POSIX inode上长大的,真诚的道歉,如果这里有任何不准确之处…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值