2015-07-22 98 views
1

我使用Python进行图像分析。我的代码的第一步是将图像从磁盘加载到一个大的20GB uint8阵列。这一步需要很长时间,加载速度约为10MB/s,并且在任务期间CPU空闲。如何在Python中提高磁盘读取速度

这似乎非常缓慢。我是否犯了一个明显的错误?我该如何提高性能?这是否是numpy数组类型的问题?

# find all image files in working folder 
FileNames = []  # FileNames is a list of image names 
workingFolder = 'C:/folder' 
for (dirpath, dirnames, filenames) in os.walk(workingFolder): 
    FileNames.extend(filenames) 
FileNames.sort() # Sorted by image number 
imNumber = len(FileNames) # Number of Images 

# AllImages initialize 
img = Image.open(workingFolder+'/'+FileNames[0]) 
AllImages = np.zeros((img.size[0],img.size[1], imNumber),dtype=np.uint8) 

for ii in range(imNumber): 
    img = Image.open(workingFolder+'/'+FileNames[ii]) 
    AllImages[:,:,ii] = img 

非常感谢您的帮助。

+3

这可能是因为你的硬盘速度很慢。你有没有通过其他方式测试它的速度?如果硬盘读/写速度是瓶颈,你的CPU将闲置。 –

+0

传输文件时,传输速度始终高于150MB/s,相信计算机中较慢的HDD会造成瓶颈。 – LapLap

回答

1

由于CPU空转,它听起来是磁盘是瓶颈。 10 Mb/s的速度有点慢,但并不慢,它让我想起了石器时代的硬盘。如果它是numpy我希望CPU忙于运行numpy代码,而不是闲置。

请注意,CPU可能有两种等待磁盘的方式。当然,首先你需要从磁盘读取数据,但是由于数据是20GB,数据可能会大到需要将其交换到磁盘。这种情况的正常解决方案是内存映射文件(这将避免将数据从磁盘移动到交换)。

尝试检查您是否可以通过其他方式更快地读取文件。例如在linux上,你可以使用dd if=/path/to/image of=/tmp/output bs=8k count=10k; rm -f /tmp/output来检查读到RAM的速度。有关检查磁盘性能的更多信息,请参阅this question

+0

SSD速度非常快,读取速度至少为200MB/s,对于较小的数据集也存在问题,但显然不是限制性的。这不是交换问题,因为仍然有大约10GB的免费Ram,并且任务管理器在此过程中没有写入磁盘。谢谢你的帮助。 – LapLap