1

我使用 Ruby 读取图像文件并将其保存到字符串中。

partial_image100 = File.read("image.tga")
partial_image99 = File.read("image.tga")
partial_image98 = File.read("image.tga")
...

我在分布式系统的一端读取这些图像。在另一个系统中,我想做一个 Tail 操作。系统只接收图像。

我有大约 100 个部分图像。我想做一个尾巴操作,像这样:

tail -c +19 image100 >> image99
tail -c +19 image99 >> image98
tail -c +19 image97 >> image96
...

基本上它只是删除部分图像的前 18 个字节,并将剩下的内容附加到下一个图像。

问题是这很慢。从 Ruby 调用 100 个 unix 命令很慢。我想重构它,以便在 Ruby 世界中发生这种情况。只是在记忆中。没有文件。

我怎样才能在 Ruby 中做到这一点?

谢谢

编辑:

图像存储在这样的哈希中:

{"27"=>"\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000E\u0001\xD0\a\xD0\a\u0018 \xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF\u0000\xFF\xFF...

编辑:

您在这里拥有所有相关代码: https ://gist.github.com/989563

有两个文件。文件中以 json 编码的代码和哈希对象。运行代码时,将在 /tmp 创建两个图像文件

  • /tmp/image-tail-merger.tga – 尾部合并算法的输出
  • /tmp/image-/time/.tga – 内存尾算法的输出

目前内存算法失败,因为生成的图像是毕加索。

如果您设法使内存中算法生成与尾合并算法相同的图像,那么您就成功了。

编辑:

我终于猜对了!!!

这是代码 https://gist.github.com/989563

4

3 回答 3

2

我可能会看一下File::Tail,类似于 Perl 模块。

File.open(filename) do |log|
 log.extend(File::Tail)
 log.interval = 10
 log.backward(10)
 log.tail { |line| puts line }
end

您也可以自己打补丁FileFile::Tail以便更清洁地使用。

于 2011-05-24T19:14:45.210 回答
2

您可能想看看String#unpack(及其逆Array#pack)。

在你的情况下,一些这样的应该做你想要的:

trunked = image.unpack('@19c*').pack('c*')
于 2011-05-24T19:43:35.727 回答
1

你可以试试这样的

image100 = "some image string"
image99 = "some other image string"

image99 += image100.slice(0,19)

编辑:在您的具体示例中,您可以这样做以遍历整个图像

(image_hash.size..1).each do i
  # Here we use slice to select everything *except* the first 19 bytes
  # Note: To select just the first 19 bytes we could do slice(0,19)
  #       To select just the last 19 bytes we could do slice(-19,19)

  # We then append this result to the next image down the line
  image_hash[i-1] += image_hash[i].slice(19,image_hash[i].size-19)
end

如果要永久删除“尾”位,可以使用slice!进行内联替换。

也许更干净一点:

# Strip the headers
image_hash.each { |k,v| v.slice!(0,19) }

# Append them together
(image_hash.keys.sort).collect{ |i| image_hash[i] }.join

编辑:工作代码示例 https://gist.github.com/989563

于 2011-05-24T19:30:33.810 回答