Fly*_*yto 12 performance file-io matlab large-data dynamic-arrays
我需要编写一个太大的数组,以适应.mat二进制文件的内存.这可以通过该matfile功能实现,该功能允许随机访问磁盘上的.mat文件.
通常,接受的建议是预分配数组,因为在循环的每次迭代中扩展它们都很慢.但是,当我问如何做到这一点时,我发现在写入磁盘而不是RAM时这可能不是一个好建议.
将打同样的性能不断增长的阵列应用,并且如果是这样,会是显著的时候相比,它需要写入到磁盘的时间呢?
(假设整个文件将在一个会话中写入,因此严重文件碎片的风险很低.)
问:增加阵列会产生相同的性能影响,如果是这样,那么与写入磁盘所需的时间相比,它会显着吗?
答:是的,如果您在没有预先分配的情况下显着增加磁盘上的文件,性能将受到影响.性能受到影响将是碎片化的结果.正如您所提到的,如果文件是在一个会话中编写的,则碎片风险较小,但如果文件显着增长则会导致问题.
MathWorks网站上提出了一个相关问题,接受的答案是尽可能预先分配.
如果您没有预先分配,那么您的性能问题的程度将取决于:
让我们假装您正在运行最近的Windows操作系统,因此使用NTFS文件系统.让我们进一步假设它已经设置为默认的4 kB簇大小.因此,磁盘空间以4 kB块的形式分配,并将这些位置索引到主文件表.如果文件增长且连续空间不可用,则只有两种选择:
文件系统选择执行最不好的选项#2,并更新MFT记录以指示新群集在磁盘上的位置.

现在,硬盘需要物理地移动读头以便读取或写入新簇,这是一个(相对)慢的过程.在移动磁头方面,等待磁盘的正确区域在其下面旋转......你可能正在寻找大约10ms的寻道时间.因此,每次敲击碎片时,HDD都会有额外的10ms延迟,以便访问新数据.SSD具有更短的寻道时间(没有移动部件).为简单起见,我们忽略了多盘系统和RAID阵列!
如果你在不同的时间继续增长文件,那么你可能会遇到很多碎片.这实际上取决于文件的增长时间/数量,以及您使用硬盘的方式.您遇到的性能影响还取决于您阅读文件的频率以及您遇到片段的频率.
MATLAB以列主要顺序存储数据,并且从注释中看起来您有兴趣对数据集执行逐列操作(总和,平均值).如果列在磁盘上变得不连续,那么你将在每次操作时击中大量碎片!
如评论中所述,读取和写入操作都将通过缓冲区执行.正如@ user3666197指出的那样,操作系统可以推测性地预读磁盘上的当前数据,因为您可能希望接下来的数据.如果硬盘有时处于空闲状态 - 保持其以最大容量运行并且在缓冲存储器中处理小部分数据可以极大地提高读写性能,则此行为尤其有用.但是,从你的问题来看,它听起来好像你想在一个巨大的(太大的内存).mat文件上执行大型操作.鉴于您的用例,硬盘无论如何都将以容量工作,而且数据文件太大而无法容纳缓冲区 - 因此这些特殊技巧无法解决您的问题.
所以......是的,你应该预先分配.是的,在磁盘上增加阵列的性能会受到影响.是的,它可能会很重要(这取决于具体的增长量,碎片等).如果你真的要深入了解HPC的精神,那么就停止你正在做的事情,抛弃MATLAB,破坏你的数据并尝试类似Apache Spark的东西!但这是另一个故事.
这是否回答你的问题?
PS更正/修正欢迎!我是在POSIX inode上长大的,如果这里有任何不准确之处,我真诚地道歉......
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |