-1

目标

将图像从 C 进程快速传递到 Python 进程。

细节

C 进程是一个命令行工具,可生成光栅图像。Python 进程是一个 GUI 应用程序,它要求 C 工具生成图像,然后显示这些图像。因此,用户(在他的操作之后)等待图像在 GUI 中显示。

速度要求

目前使用的系统是由 C 应用程序将文件写入磁盘,然后由 Python 应用程序读回。图像的大小可能以像素为单位不同(但大约为 1000x1000)。当前格式是未压缩的,但是使用压缩格式传输也很慢。

通常,需要创建和显示多个图像,因此也可以应用一些并行方法。然而,并行化本身(以及压缩)并没有使传输更快。

平台和许可证

解决方案应该是跨平台的,尤其是 GNU/Linux、MS Windows 和 Mac OS X。

该项目在 GNU GPL 2 或更高版本下,因此该解决方案应该是兼容的。

图书馆

该解决方案不应带来新的大型依赖项,例如 boost 库。更小,系统或已经使用的库更受欢迎。

C 应用程序正在使用 cairo 库。除非确实需要,否则最好不要添加新的依赖项。在极端情况下,可以使用 ctypes 将 C 代码包装到 Python 脚本中,但这不是首选。

Python 应用程序使用 wxPython、ctypes 和 PIL。可以添加新的依赖项,并且可以(甚至)包含新的库(但依赖项越少越好)。

4

2 回答 2

0

那有多“慢”?如果你已经在使用库——比如 PIL 和 cairo——他们确实有优化的代码来处理图像。您的解决方案可以通过在内存中传输字段来优化,而不是先写入磁盘,然后重新读取它们 - 而且,通过不使用原始图像 - LZ 风格的压缩可以提高未压缩图像的速度 - 我认为“默认情况下,pcx" 或 "tiff" 可以使用此类压缩。(另一方面,PNG 压缩很慢)。

对于使用内存传输而不是通过磁盘,我认为您可以使用以下方法:创建一个使用“cython”的二进制模块,它将原始图像数据提供给 PIL Image 对象 - 并使用调用 cython0--reated 函数多处理,可能带有 concurrent.futures 的反向移植

Cython 是构建的必要条件,但不是运行此类模块的必要条件 - 我必须添加,因为依赖关系是一个问题。

无论如何,我认为您应该在花费大量时间之前准确地分析您的系统 - 我认为您无法获得更好的速度(如果图像处理步骤是,它可能会提高 200-300%轻 - 但如果这会将你的时间从 3 秒减少到 1 秒,你就不会那么好 - 从你的问题我推断你想要一个数量级的提升)。如果您还没有并行运行图像处理 C 程序,那么您当然应该为每个 CPU 内核生成至少一个这样的进程。

于 2013-04-17T12:52:14.893 回答
0

Given that...

The C process is a command line tool...

...your options are quite limited. I answered a similar question quite recently, which uses pipes.

If you could replace the command line tool with a daemon process, you could avoid the overhead of creating a new process each time, and use something like sockets instead.

于 2013-04-17T12:42:25.857 回答