Ruby 高效地将内存中的文件内容传输到命令行命令

Ruby 高效地将内存中的文件内容传输到命令行命令,ruby,linux,command-line,Ruby,Linux,Command Line,我有一个ruby脚本,它在某一点上有一个内存中的文件,该文件可能由文件系统中的一个条目支持,也可能不支持。简单的解决方案是,如果文件系统条目不存在,则创建一个tempfile,但这将导致命令行命令将该文件重新读取到内存中 理想情况下,我希望避免多次将文件读入内存,因为它可能相当大 现在,命令行命令确实接受管道输入,所以我认为这可能是一个好的解决方案,但是我找不到任何方法来实现将Ruby文件对象的内容管道化到命令行上发生的事情中 如果我从错误的方向出发,我也愿意接受其他建议。文件系统条目不支持的文

我有一个ruby脚本,它在某一点上有一个内存中的文件,该文件可能由文件系统中的一个条目支持,也可能不支持。简单的解决方案是,如果文件系统条目不存在,则创建一个tempfile,但这将导致命令行命令将该文件重新读取到内存中

理想情况下,我希望避免多次将文件读入内存,因为它可能相当大

现在,命令行命令确实接受管道输入,所以我认为这可能是一个好的解决方案,但是我找不到任何方法来实现将Ruby文件对象的内容管道化到命令行上发生的事情中


如果我从错误的方向出发,我也愿意接受其他建议。文件系统条目不支持的文件正在从远程HTTP流读取。

一种方法是将
IO
的内容读入字符串,然后使用类似的方法(使用
),或者创建子进程并将内容写入子进程stdin:

f = the_file_or_io_object
data = f.read

IO::popen('the_command', 'r+') do |io|
  io.write data
  io.close_write
  puts io.read
end
虽然这样可以避免将文件写入磁盘(除非它已经与tempfile一起使用),但它需要将文件内容读入内存,然后将其传递给子进程,因此它们在内存中存在两次。如果您想避免这种情况,您可以使用(如果您的系统有)和:

如果您使用的是Windows,则可能没有
fork
,因此您可以尝试重定向
stdin

pid = spawn 'the_command', :in => f

Process.wait pid

与其描述你认为应该是什么解决方案,不如告诉你想做什么会更有成效?为什么要将内存中的文件内容传输到命令行?@LieRyan这就是为什么要写最后一段。。。如果需要,我很乐意详细说明,但我认为它很好地描述了这种情况。你说的“内存文件”是什么意思?您是否有要使用的字符串形式的文件内容?@matt我指的是Ruby文件对象,它可以使用或通过从文件系统打开真实文件来创建。我还考虑过删除OpenURI包装,只使用原始HTTP请求检索数据,因为OpenURI在引擎盖下使用Tempfile对象。@Dan:是的,最后一段意思是你可以接受其他建议,但是如果我们不知道你想做什么,我们怎么给你建议呢?你为什么认为你想做你想做的事?你现在认为你提出的解决方案可以解决的情况是如何结束的?到目前为止,这个问题太模糊了,无法回答。谢谢!“重新打开”方法与票证类似。我会推迟接受,给别人一个回答的机会,但我可能会接受这个。
pid = spawn 'the_command', :in => f

Process.wait pid