问:增长数组应用性能是否相同,如果与写入磁盘的时间相比,是否重要?
答:是的,如果您在磁盘上大幅增长文件,而不预先分配,性能将会受到影响.表演打击将是分裂的后果.如您所提到的,如果文件是在一个会话中写入的,则碎片化风险较小,但如果文件显着增加,则会导致问题.
在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上长大的,真诚的道歉,如果这里有任何不准确之处…