如何在Ruby中为外部应用程序编写高效的包装器?

时间:2012-12-11 19:28:32

标签: ruby external wrapper

我有用C编写的外部应用程序,它在命令行上调用,如下所示:

 app [options] <metadata file> < <input file> > <output file>

元数据基本上是一个文本字符串,输入和输出数据基本上是表格文本。

我想在Ruby的紧密循环中运行这个应用程序。我怎样才能最有效地完成这项工作?我想将输入和输出数据保存在内存中,并且我希望每次循环时都避免将元数据写入磁盘以避免磁盘IO开销 - 这似乎与popen / popen3解决方案冲突。

1 个答案:

答案 0 :(得分:1)

如果您可以访问C代码,那么它很容易重新连接它从STDIN获取输入并传递一个JSON字符串,以便它收集所需的元数据和输入。输出可以保留现在的任何格式,如果需要,也可以是JSON。

如果您无法访问代码,则必须在该应用的限制范围内工作,这意味着从磁盘读取。您可以尝试使用管道或Unix套接字来愚弄应用程序以获取输入和输出文件,但我怀疑它可能仍然会作为临时缓冲区或缓存在某个地方碰到磁盘。

我认为你最好的选择是在superuser.com上询问如何欺骗应用程序从非磁盘文件中读取其输入和元数据。


另一个想法是,如果您有C应用程序的代码,您可以从Ruby和C代码读取/写入memcached存储,这将为您提供非常快的I / O.