Chuyển đổi ImageMagick và RAM thấp


12

Vui lòng xem xét các lệnh sau cho gói hình ảnh:

sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

Bây giờ test1.jpglà một hình ảnh khá lớn (12,5 MB), nhưng không phải là kích thước chưa từng thấy, nhưng máy chủ tôi đang làm việc chỉ có 1G bộ nhớ ( Amazon EC2 t2.micro nếu nó giúp)

Không có lỗi đang được ném, và không có test2.jpgđược tạo ra. Tôi đã thử nghiệm điều này với hình ảnh nhỏ hơn và nó hoạt động tốt. Tôi đã nghĩ 1G nếu bộ nhớ sẽ có nhiều để quản lý thay đổi kích thước, nhưng có lẽ không?

Lựa chọn của tôi là gì, tôi phải có thêm bộ nhớ hay tôi đang thiếu thứ gì?

Mọi góp ý đều rất được hoan nghênh!

Yêu cầu chỉnh sửa

đầu ra strace cho thấy: +++ killed by SIGKILL +++cùng với rất nhiều lệnh trông bình thường (mở /usr/share/localvà đọc các chuỗi dài, mà tôi giả sử là dữ liệu hình ảnh)

miễn phí cho tôi:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

Vì vậy, có vẻ như trao đổi không được kích hoạt, vì vậy tôi sẽ xem xét việc tạo một tệp hoán đổi để xem điều này có sắp xếp các vấn đề của tôi không.

Tập tin cho tôi:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Tôi cũng sẽ dán đầy đủ / đường dẫn / đến / img nhưng không may nó chứa dữ liệu nhạy cảm (địa chỉ email của khách hàng, v.v.)


1
Tại sao bạn sử dụng sudotrong lệnh này?
Charles Green

1
Nhận được tin nhắn "Bị giết" khi tôi không
Aerald

3
Ypu có thể cố gắng giới hạn bộ nhớ được sử dụng cho bộ đệm pixel với đối số -limit memory 64MiB(32MiB có thể hơi nhỏ một chút. Mặc định là 1,5GiB). Và nó sẽ cung cấp cho bạn một số đầu ra mô tả trong trường hợp nó không thành công.
Dadexix86

2
Hãy thử chạy lệnh với phần stracebổ sung phía trước lệnh, xem những gì các cuộc gọi hệ thống được thực hiện, lỗi được ném. Hãy cho chúng tôi biết
Sergiy Kolodyazhnyy

2
Làm xong. Tôi rất vui vì bạn đã giải quyết nó! đầu ra miễn phí xác nhận rằng hoán đổi bị tắt và thông tin tệp xác nhận rằng đó không phải là một tệp được xác định sai. Đẹp chỉnh sửa! +1
Anh Cả Geek

Câu trả lời:


7

Tôi cho rằng bạn sắp hết RAM. Bạn có thể xác minh điều này watch cat /proc/meminfotrong khi quy trình của bạn đang chạy.

Bạn có thể không đủ RAM và / hoặc SWAP để hoàn thành nhiệm vụ của mình.

Do điều kiện ram thấp, đảm bảo rằng trao đổi được bật swapon -avà nếu không có trao đổi được thiết lập trên hệ thống, hãy tạo một phân vùng để trao đổi trên không gian đĩa không sử dụng và kích hoạt nó. Điều này có thể sẽ giải quyết vấn đề. Có một câu trả lời hay của @Takkat về cách thực hiện điều đó tại đây Nếu bạn không có quyền truy cập vào phân vùng máy chủ, bạn cũng có thể sử dụng một tệp hoán đổi để trao đổi


1
OP là về một máy chủ đám mây, tạo phân vùng trao đổi có thể không phải là một tùy chọn. Bạn cũng có thể thêm Cách thêm tệp hoán đổi mới .
user.dz

@Sneetsher Đó chính xác là những gì tôi đã làm, nhận xét tốt
Aerald

@Sneetsher "OP nói về một máy chủ đám mây" không rõ ràng (ít nhất là với tôi) từ dữ liệu trong câu hỏi nhưng bạn đã đưa ra một quan điểm tốt. chỉnh sửa câu trả lời.
Anh Cả Geek

@ElderGeek, thực ra là vậy nhưng không được làm nổi bật Amazon EC2 t2.micro, tôi đã chỉnh sửa câu hỏi để làm rõ, thêm thẻ để dễ liên kết với các câu hỏi liên quan khác.
user.dz

@Sneetsher Tôi thấy điều đó bây giờ. Cảm ơn vì nỗ lực của bạn!
Anh Cả Geek

5

Vấn đề trong câu hỏi đã được giải quyết bằng cách thêm trao đổi thích hợp. Để hoàn thiện, hãy để tôi tóm tắt các tùy chọn bổ sung mà chúng tôi có khi chạy Image Magick converttrên các tệp lớn trên hệ thống bộ nhớ thấp hoặc khi không có trao đổi có sẵn hoặc trao đổi quá nhỏ.

Các phương pháp được đề cập dưới đây được xây dựng chi tiết trong hướng dẫn sử dụng Image Magick:

Xử lý hình ảnh thực sự lớn


Tóm lược:

  1. Giới hạn sử dụng bộ nhớ với tùy chọn -limit

    Bằng cách đó, Image Magick sẽ tạo một tệp tạm thời để xử lý ảnh ngay khi vượt quá giới hạn bộ nhớ đã cho. Điều này cần sự cho phép ghi cho Image Magick trên thư mục tệp tạm thời. Chúng tôi có thể đưa ra bất kỳ đường dẫn nào trong đó tệp tạm thời sẽ được tạo trong một biến môi trường MAGICK_TMPDIR. Một lệnh ví dụ có thể trông tương tự như thế này:

        env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    Làm việc trên đĩa chứ không phải trong RAM sẽ làm chậm tốc độ xử lý đáng kể.

  2. Làm việc với "Tập tin đĩa được gắn vào bộ nhớ"

    Tạo các tệp MPC là yêu cầu tài nguyên nhưng nó không cần quá nhiều tài nguyên để chuyển đổi từ các tệp MPC. Do đó, có thể được xem xét trong trường hợp chúng ta cần chuyển đổi cùng một nguồn với các tham số khác nhau nhiều lần. Quy trình công việc sau đó có thể tương tự như sau:

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. Làm việc trên các phần nhỏ của hình ảnh bằng cách sử dụng stream

    Sử dụng luồng yêu cầu chỉ xử lý một phần của hình ảnh nguồn mà không cần phải tải toàn bộ hình ảnh vào bộ nhớ.

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    Trong ví dụ trên, -extracttùy chọn lấy các giá trị kích thước và bù như được định nghĩa bởi hình học Image Magick . Chúng ta sẽ phải dán các viên gạch lại với nhau để có được hình ảnh được chia tỷ lệ tổng thể. Thật không may, luồng không hoạt động cho tất cả các định dạng hình ảnh nhưng được cho là hoạt động tốt trên hình ảnh JPEG.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.