如何不断把数写⼊数组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数组赋值MATLAB在Column-major order中存储数据,并且从评论看来,您有兴趣在数据集上执⾏列式操作(总和,平均值).如果这些列在磁盘上变得不连续,那么你将在每个操作上打出很多碎⽚!
如注释所述,读写操作将通过缓冲区执⾏.由于@ user3666197指出,操作系统可以推测读取磁盘上的当
前数据,因为您可能希望下⼀个数据.如果硬盘空闲时,这种⾏为特别有⽤ – 保持其在最⼤容量下运⾏,并且在缓冲存储器中使⽤数据的⼩部分可以⼤⼤提⾼读写性能.然⽽,从你的问题,听起来好像你想在⼀个巨⼤的(太⼤的内存).mat⽂件上执⾏⼤的操作.鉴于您的⽤例,硬盘将⽆法正常⼯作,并且数据⽂件太⼤,⽆法适应缓冲区 – 所以这些特殊技巧将⽆法解决您的问题.
所以…是的,你应该预先分配.是的,在磁盘上增加阵列的性能将会适⽤.是的,这可能是重要的(这取决于细节,如增长量,碎⽚等).如果您要真正进⼊HPC精神,那么请停⽌您正在做的事情,扔掉MATLAB,分析数据并尝试像Apache Spark!但这是另⼀个故事.
这回答你的问题吗?
附:更正/修改欢迎!我是在POSIX inode上长⼤的,真诚的道歉,如果这⾥有任何不准确之处…
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论