2013-01-20 2 views
0

나는 1500x2000px에서 900x1200px로 이미지의 크기를 조정하는 간단한 함수를 작성했습니다.파이썬 이미징 라이브러리 루프 성능이 반복으로 느려짐

def resizeImage(file_list): 
    if file_list: 
     if not os.path.exists('resized'): 
      os.makedirs('resized') 
     i = 0 
     for files in file_list: 
      i += 1 
      im = Image.open(files) 
      im = im.resize((900,1200),Image.ANTIALIAS) 
      im.save('resized/' + files, quality=90) 
     print str(i) + " files resized successfully" 
    else: 
     print "No files to resize" 

일부 예제 이미지로 실행하는 데 걸리는 시간을 측정하기 위해 timeit 함수를 사용했습니다. 다음은 결과의 예입니다.

+---------------+-----------+---------------+---------------+---------------+ 
| Test Name  | No. files |  Min  |  Max  | Average | 
+---------------+-----------+---------------+---------------+---------------+ 
| Resize normal |  10 | 5.25000018229 | 5.31371171493 | 5.27186083393 | 
+---------------+-----------+---------------+---------------+---------------+ 

하지만 난이 테스트를 반복하면 시간은 점차 메신저가 테스트를 실행하는 방법이있다

+---------------+-----------+---------------+---------------+---------------+ 
| Test Name  | No. files |  Min  |  Max  | Average | 
+---------------+-----------+---------------+---------------+---------------+ 
| Resize normal |  10 | 5.36660298734 | 5.57177596057 | 5.45903467485 | 
+---------------+-----------+---------------+---------------+---------------+ 

+---------------+-----------+---------------+---------------+---------------+ 
| Test Name  | No. files |  Min  |  Max  | Average | 
+---------------+-----------+---------------+---------------+---------------+ 
| Resize normal |  10 | 5.58739076382 | 5.76515489024 | 5.70014196601 | 
+---------------+-----------+---------------+---------------+---------------+ 

+---------------+-----------+---------------+---------------+-------------+ 
| Test Name  | No. files |  Min  |  Max  | Average | 
+---------------+-----------+---------------+---------------+-------------+ 
| Resize normal |  10 | 5.77366483042 | 6.00337707034 | 5.891541538 | 
+---------------+-----------+---------------+---------------+-------------+ 

+---------------+-----------+---------------+--------------+---------------+ 
| Test Name  | No. files |  Min  |  Max  | Average | 
+---------------+-----------+---------------+--------------+---------------+ 
| Resize normal |  10 | 5.91993466793 | 6.1294756299 | 6.03516199948 | 
+---------------+-----------+---------------+--------------+---------------+ 

즉 계속 증가.

def resizeTest(repeats): 
    os.chdir('C:/Users/dominic/Desktop/resize-test') 
    files = glob.glob('*.jpg') 

    t = timeit.Timer(
     "resizeImage(filess)", 
     setup="from imageToolkit import resizeImage; import glob; filess = glob.glob('*.jpg')" 
    ) 
    time = t.repeat(repeats, 1) 

    results = { 
     'name': 'Resize normal', 
     'files': len(files), 
     'min': min(time), 
     'max': max(time), 
     'average': averageTime(time) 
    } 
    resultsTable(results) 

기계식 하드 드라이브에서 처리 한 이미지를 SSD로 옮겼지만 문제가 지속됩니다. 나는 또한 사용중인 메모리를 점검했으며, 26Mb 정도의 토큰을 사용하여 CPU의 한 코어의 약 12 ​​%를 사용했다.

앞으로 나는 멀티 프로세싱 라이브러리를 실험하여 속도를 높이고 싶지만, 먼저이 문제의 맨 아래로 들어가고 싶습니다.

성능이 저하되는 루프에 문제가 있습니까?

+0

'im.save()'호출을 제거하면 어떻게됩니까? 나는 감속이 디스크에 반복적으로 기록하기 때문이라고 생각합니다. –

+0

예 디스크 쓰기로 인해 디스크가 느려져서 저장을 제거하면 실제로 실행될 때마다 시간이 늘어납니다. @MartijnPieters이 기능은 멀티 프로세싱 모듈로 가속화하는 것이 적절하다고 생각하십니까? 나는이 질문들을 닫을 것입니다. –

+0

CPU 코어가 여러 개인 컴퓨터가있는 경우 멀티 프로세싱을 사용하면 프로세스 속도가 향상 될 수 있습니다 (각 크기 조정은 별도의 CPU 코어에서 실행 됨). –

답변

1

im.save() 전화가 걸림돌입니다. 동일한 디렉토리에 반복적으로 쓰는 것은 OS 디스크 캐시를 쓰레기로 만드는 것입니다. 전화를 끊을 때 OS는 이미지를 최적화 할 수있었습니다 디스크 캐시를 통해 번 액세스를 읽습니다.

컴퓨터에 CPU 코어가 여러 개있는 경우 OS에서 각 크기 조정 작업을 실행하기 위해 해당 코어에서 여러 하위 프로세스를 예약하므로 실제로 크기 조정 프로세스의 속도를 높일 수 있습니다. 모든 프로세스가 읽기 및 쓰기를 위해 동일한 디스크에 액세스해야하기 때문에 선형 성능 향상을 얻지 못할 것입니다.

+0

감사합니다 @martijn, 나는 멀티 프로세싱 모듈을 살펴볼 것입니다. 파일과 디렉토리를 SSD로 옮기는 것이별로 효과가 없었던 것은 흥미 롭습니다. –

관련 문제