0

我编写了一个特定的图像处理算法,它大量使用imwriteimread。以下示例将在启用超线程的 6 核 i7 机器上同时在八个 Matlab 会话上运行。(每个会话的文件名不同。)

tic; 
for i=1:1000 
    %a processing operation will be put here%
    imwrite(imgarray,temp,'Quality',100); 
    imgarray=imread(temp); 
end 
toc;

temp=[ramdrive_loc temp];出于两个目的考虑更改示例代码:

  • 减少时间消耗
  • 降低硬盘磨损

创建的图像文件大小约为 1 Mb。硬盘驱动器组成 RAID0,带有 2 x 7.2k Caviar Blacks。该机器是 Windows 机器,其中的分区被格式化为 NTFS。

上面的输出toc是(不处理图像):

没有Ramdisk:104.330466 秒。

使用Ramdisk:106.100880 秒。

有什么导致我没有获得任何速度?将ramdisk的文件系统更改为FAT32有帮助吗?

注意:还有其他关于 ramdisk 与硬盘比较的问题;但是这个问题主要是关于imreadimwrite和 Matlab I/O 的。

补充: ram 盘是通过 SoftPerfect 的免费软件设置的。它有 3gb 的空间,对于任务来说绰绰有余(在 Matlab 会话期间,最多可以生成和写入 10mb)。

4

1 回答 1

1

文件缓存。可能,Windows 的文件缓存已经在这里加速了你的 I/O 活动,所以 RAM 磁盘并没有给你额外的加速。当您写出文件时,它被写入文件缓存,然后异步刷新到磁盘,因此您的 Matlab 代码不必等待物理磁盘写入完成。当您立即将同一个文件读回内存时,它很有可能仍然存在于文件缓存中,因此它是从内存中提供的,而不是引发物理磁盘读取。

如果那是您的实际代码,那么您将一遍又一遍地重写同一个文件,这意味着所有活动都可能发生在磁盘缓存内,因此您不会遇到底层存储机制的瓶颈。

重写您的测试代码,使其看起来更像您的实际工作负载:如果这是您在实践中将要执行的操作,则在每次通过时写入不同的文件,包括图像处理代码,并实际并行运行多个进程。将它放在 Matlab 分析器中,或添加更细粒度的 tic/toc 调用,以查看您实际在 I/O 上花费了多少时间(例如imreadimwrite,以及它们中执行文件 I/O 的部分)。如果您在 I/O 之外进行重要的处理,您可能看不到 RAM 磁盘的显着加速(如果有的话),因为文件缓存将有时间在您的其他处理期间执行实际的物理 I/O。

而且由于您说最多有 10 MB 被反复写入,所以它足够小,可以很容易地放入文件缓存中,并且您的实际物理 I/O 吞吐量非常小:如果您写一个文件,然后在文件缓存将其刷新到磁盘之前用新数据覆盖其内容,操作系统永远不必将第一组数据一直刷新到磁盘。由于缓存,您的 I/O 可能已经大部分发生在内存中,因此切换到 RAM 磁盘将无济于事,因为物理 I/O 不是瓶颈。

现代操作系统会进行大量缓存,因为它们知道会发生这种情况。RAM 磁盘不一定会有很大的加速。imreadMatlab 或/imwrite关于这种行为没有什么特别的;其他 RAM 磁盘问题,例如RAMdisk 比磁盘慢吗?仍然相关。

于 2014-05-19T04:18:42.353 回答