1 回答

TA貢獻1911條經驗 獲得超7個贊
我試過我的 2015 i5 筆記本電腦(兩個核心,四個線程)。我做了一些這樣的測試數據:
$ mkdir sample
$ cd sample
$ vipsheader ../fg.png ../bg.png?
../fg.png: 200x200 uchar, 4 bands, srgb, pngload
../bg.png: 500x500 uchar, 4 bands, srgb, pngload
$ for i in {0..1000}; do cp ../fg.png fg$i.png; done
$ for i in {0..1000}; do cp ../bg.png bg$i.png; done
所以 1,000 張 500x500 和 200x200 PNG 圖像。
首先,基本情況(IM 6.9.10):
$ time for i in {0..1000}; do convert bg$i.png -page +10+10 fg$i.png -background none -flatten out$i.png; done
real? ? 0m49.461s
user? ? 1m4.875s
sys 0m6.690s
49s 大約是每秒 20 次操作。
接下來,我嘗試使用 GNU parallel。這是并行運行足夠多的內核以保持所有內核加載的簡單方法:
$ time parallel convert bg{}.png -page +10+10 fg{}.png -background none -flatten? out{}.png ::: {0..1000}
real? ? 0m32.278s
user? ? 1m46.428s
sys 0m11.897s
32s 是 31 次操作/秒。這是在雙核筆記本電腦上進行的——您會發現使用更大的臺式機可以獲得更好的加速。
最后,我寫了一個小的pyvips程序來完成你的任務。pyvips 是libvips的 Python 綁定,但也有 Go 綁定。
import pyvips
for i in range(0, 1000):
? ? bg_name = "bg" + str(i) + ".png"
? ? fg_name = "fg" + str(i) + ".png"
? ? out_name = "out" + str(i) + ".png"
? ? bg = pyvips.Image.new_from_file(bg_name, access="sequential")
? ? fg = pyvips.Image.new_from_file(fg_name, access="sequential")
? ? result = bg.composite2(fg, "over", x=10, y=10)
? ? result.write_to_file(out_name)
我懂了:
$ time ~/try/try289.py?
real? ? 0m25.887s
user? ? 0m36.625s
sys 0m1.442s
26s 大約是每秒 40 次操作。如果并行運行多個,您將能夠更快地獲得它。
您遇到的限制之一是 PNG 格式——該庫是單線程的,而且速度很慢。如果你愿意嘗試 TIFF,你可以獲得相當多的速度。
帶放氣壓縮的 TIFF 在功能上類似于 PNG。如果我嘗試:
$ vips copy fg.png fg.tif[compression=deflate]
$ vips copy bg.png bg.tif[compression=deflate]
$ ls -l bg.*
-rw-r--r-- 1 john john 19391 Dec 27 20:48 bg.png
-rw-r--r-- 1 john john 16208 Jan? 2 18:36 bg.tif
所以在這種情況下,它實際上要小一些。如果我將 pyvips 程序更改為:
bg_name = "bg" + str(i) + ".tif"
fg_name = "fg" + str(i) + ".tif"
out_name = "out" + str(i) + ".tif[compression=deflate]"
運行它,我看到:
$ time ~/try/try289.py?
real? ? 0m17.618s
user? ? 0m23.234s
sys 0m1.823s
大約 55 次操作/秒。
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報