如何在Python

时间:2015-07-22 07:13:46

标签: python

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

这似乎非常缓慢。我犯了一个明显的错误吗?如何提高性能?这是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

非常感谢你的帮助。

1 个答案:

答案 0 :(得分: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来检查读取速度。有关检查磁盘性能的详细信息,请参阅this question