gpt4 book ai didi

ruby - 有效地将内存中的文件内容通过管道传输到命令行命令

转载 作者:太空宇宙 更新时间:2023-11-04 11:08:07 27 4
gpt4 key购买 nike

我有一个 ruby​​ 脚本,在某一时刻,它有一个内存文件,文件系统中的条目可能支持也可能不支持。如果文件系统条目不存在,天真的解决方案是创建一个临时文件,但这将导致命令行命令将文件重新读入内存。

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

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

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

最佳答案

一种方法是将IO 的内容读入字符串,然后使用类似Kernel#open 的内容。 (带有 |),IO::popenopen3创建子进程并将内容写入子进程标准输入:

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

虽然这避免了将文件写入磁盘(除非它已经存在于例如临时文件中),但它涉及将文件内容读入内存,然后将它们传递给子进程,因此它们在内存中两次。如果你想避免这种情况,你可以使用 fork (如果你的系统有)和 reopen :

# f as before, no need to read it in this time

pid = fork do
$stdin.reopen f
# Now stdin is the file, so when the command is run it will see
# it on its stdin
exec 'the_command'
end

Process.wait pid

如果你在 Windows 上,你可能没有 fork,所以你可以试试 spawn , 重定向 stdin:

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

Process.wait pid

关于ruby - 有效地将内存中的文件内容通过管道传输到命令行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24347054/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com