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

2 つのファイルがあります。ファイル内の json でエンコードされたコードとハッシュ オブジェクト。コードを実行すると、/tmp に 2 つのイメージ ファイルが作成されます。

  • /tmp/image-tail-merger.tga – 末尾マージ アルゴリズムからの出力
  • /tmp/image-/time/.tga – in-memory-tail アルゴリズムからの出力

現在、生成された画像はピカソであるため、メモリ内アルゴリズムは失敗します。

インメモリ アルゴリズムで末尾マージ アルゴリズムと同じ画像を生成することができれば、成功です。

編集:

やっと当たった!!!

ここにコードがあります https://gist.github.com/989563

4

3 に答える 3

2

Perlモジュールに似たFile::Tailを見るかもしれません。

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

自分でモンキーパッチを適用して、よりクリーンFileに使用することもできます。File::Tail

于 2011-05-24T19:14:45.210 に答える
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 に答える