2015-07-22 43 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