我使用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
非常感谢你的帮助。
答案 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。