2011-10-14 32 views
10

Tôi đang sử dụng PIL (thư viện hình ảnh python) để thực hiện một số thao tác hình ảnh, đặc biệt là tôi ghép các hình ảnh lại với nhau.Làm cách nào để tìm hiểu lý do sử dụng chức năng PIL là do lỗi bộ nhớ?

Mã của tôi có vẻ hoạt động tốt đối với một số hình ảnh với số lượng nhỏ, nhưng đôi khi tôi nhận được MemoryError.

Phần đặc biệt lạ đối với tôi là tôi không thực hiện thao tác trên ảnh bit, tất cả đều hoạt động với < 10 hình ảnh dưới 10kb.

Tôi đang thực hiện rất nhiều cuộc gọi đến Image.resize, nhưng tôi ngạc nhiên rằng có những vấn đề quan trọng từ đó.

Đây là chồng theo dõi:

Traceback (most recent call last):                                    
    File "test.py", line 15, in <module>                                   
    pprint(scale_matrix_down((90,90), [inpt]))                                 
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 105, in scale_matrix_down                        
    return [shrinkRow(row, row_width_overflow(row)) for row in matrix]                           
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 103, in shrinkRow                          
    rest   = [shrinkIm(im, pixels_per_im) for im in row[remaining_pixels:]]                         
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 110, in shrinkIm                          
    return im.resize((im.size[0] - num_pix, im.size[1] - num_pix))                            
    File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1302, in resize                          
    im = self.im.resize(size, resample)                                   
MemoryError 

Hãy ghi nhớ những hình ảnh đều ít hơn 90x90 pixel.

Tôi rất nhiều ở điểm chết và thực sự không chắc chắn cách tiếp tục. Tôi có thể làm gì để giải phóng bộ nhớ? Tôi có nên gọi cho nhà điều hành del hoặc có điều gì đơn giản hơn tôi có thể làm không? Cảm ơn trước sự giúp đỡ của bạn!

+3

kiểm tra để đảm bảo rằng bạn không định kích thước thành kích thước âm. Xem mức sử dụng bộ nhớ của bạn khi bạn chạy quy trình để xem bộ nhớ có tăng kích thước trước khi nó bị chết hay không. –

+0

Cảm ơn Winston, bạn đã hoàn toàn đúng! – jkarm

Trả lời

8

Hóa ra đây không thực sự là lỗi bộ nhớ. Như Winston Ewert đã chỉ ra rằng tôi đang thực tế cho các thông số tiêu cực vào một phương pháp thay đổi kích thước hình ảnh.

Mặc dù tài liệu python nói rằng lỗi bộ nhớ là dành cho các vấn đề với bộ nhớ, lỗi này được ném khi bạn cung cấp thông số âm để thay đổi kích thước. Nghi ngờ của tôi là bởi vì PIL sử dụng nhiều thư viện C, những thư viện này có thể dẫn đến rò rỉ với đầu vào không hợp lệ và vì thư viện không kiểm tra giới hạn, nên lỗi chỉ đơn giản là bong bóng lên.

8

Để giải thích những gì thực sự xảy ra:

  1. Bạn cố gắng thay đổi kích thước một hình ảnh để có chiều rộng tiêu cực
  2. PIL cố gắng bố trí một hình ảnh tiêu cực có kích thước để phù hợp với hình ảnh thay đổi kích cỡ
  3. PIL gọi malloc với một số lượng âm của bộ nhớ để giữ cho hình ảnh có kích thước tiêu cực
  4. malloc có một size_t không được ký. Kết quả là, yêu cầu bộ nhớ âm được hiểu là một số rất lớn chứ không phải là số âm.
  5. malloc không thể phân bổ một cái gì đó lớn, vì vậy nó tạo ra một lỗi
  6. Để PIL này trông giống hệt như một trong số lỗi bộ nhớ để nó báo cáo nó như vậy

rò rỉ Vì vậy, các nguyên liệu đầu vào không hợp lệ không gây ra hoặc hành vi xấu khác. Họ kết quả trong một yêu cầu malloc xấu và bỏ cuộc. PIL có thể kiểm tra kích thước âm và do đó tạo ra thông báo lỗi tốt hơn. Có lẽ họ hình dung nó không đáng vì nó đã tạo ra một thông báo lỗi nếu bạn làm điều đó.

Khi nó xảy ra, thực sự chạy bộ nhớ là khó khăn vì hệ điều hành sẽ cố gắng khá khó khăn để giữ cho một quá trình đi như bằng cách sử dụng bộ nhớ ảo. Hệ thống của bạn sẽ bog xuống trước khi nó được đến một điểm hết bộ nhớ. Vì vậy, tôi đã phát hiện ra rằng hầu hết các lỗi ngoài bộ nhớ là do các yêu cầu cho số lượng âm của bộ nhớ. Theo như tôi nhớ lại, các lỗi ngoài bộ nhớ thực sự mà tôi đã nhận được đã có trong Java có thể do việc sử dụng một máy ảo.

Các vấn đề liên quan