我需要捕获外部进程的二进制输出。输出变得相当大,约为GB。
此刻,我以以下方式使用Open3.popen3
:
cmd = 'rtrace -args > file.out'
lines = [some, array, of, floats].pack('F*')
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
stdin.puts lines.pack("F*")
stdin.close
puts wait_thr.value
end
File.open('file.out', 'rb') do |f|
# parsing binary file
end
为了使我的代码更快,我尝试避免再次写入和读取文件。这是工作代码
stdout, status = Open3.capture2(cmd, :stdin_data => lines.pack("F*"), :binmode=>true)
rad_output = StringIO.new(stdout)
puts status
rad_output.binmode
# Parse rad_output as before
我注意到我的代码慢了大约30%。我猜这是因为我正在创建一个新的String对象,但是由于我一直在内存中,所以希望有更好的性能。
这是预期的吗?我在做错什么吗?