我编写了一个特殊的图像处理算法,大量使用imwrite
和imread
。以下示例将在启用超线程的6核i7计算机上的8个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与硬盘比较的问题;但是这个问题主要是关于imread
,imwrite
和Matlab I / O.
增加:ram磁盘通过SoftPerfect的免费软件设置。它有3GB的空间,这对于任务来说已经足够了(在Matlab会话期间最多可以生成和写入10mb)。
答案 0 :(得分:1)
文件缓存。 Windows的文件缓存可能已经加速了你的I / O活动,因此RAM磁盘不会给你额外的加速。当您写出文件时,它会写入文件缓存,然后异步刷新到磁盘,因此您的Matlab代码不必等待物理磁盘写入完成。当你立即将相同的文件读回内存时,它很可能仍然存在于文件缓存中,因此它是从内存中提供的,而不是引起物理磁盘读取。
如果那是你的实际代码,你会反复重写同一个文件,这意味着所有的活动都可能发生在磁盘缓存中,所以你没有遇到底层存储机制的瓶颈。
重写您的测试代码,使其看起来更像您的实际工作负载:如果您将在实践中执行此操作(包括图像处理代码)并实际并行运行多个进程,则在每次传递时写入不同的文件。把它放在Matlab分析器中,或添加更细粒度的tic / toc调用,看看你实际花在I / O上的时间(例如imread
和imwrite
,以及它们的部分内容正在做文件I / O)。如果您在I / O之外进行重要的处理,则可能看不到RAM磁盘的显着加速(如果有的话),因为文件缓存在您进行其他处理时有时间进行实际的物理I / O.
而且,既然你说最多可以反复写入10 MB,那么它就足够小了,它可以很容易地放在文件缓存中,并且你的实际物理I / O吞吐量非常小:如果您编写文件,然后在文件缓存将其刷新到磁盘之前用新数据覆盖其内容,则操作系统永远不必将第一组数据一直刷新到磁盘。由于缓存,您的I / O可能已经在内存中发生,因此切换到RAM磁盘无济于事,因为物理I / O不是瓶颈。
现代操作系统会进行大量缓存,因为他们知道这种情况会发生。 RAM磁盘不一定是一个很大的加速。关于此行为,Matlab或imread
/ imwrite
没有具体内容;其他RAM磁盘问题如RAMdisk slower than disk?仍然相关。