tshi2438
@tshi2438

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ストリームデータ処理について

Q&A

解決したいこと

ストリーミングデータ処理について

時間とともにほぼ無限に増えるデータにたいして1行分の値を保持し、その値に対応する値がでるまでのデータを読み捨てていきその値がでたときに相応の処理をする。
というものを無限ループ処理を利用して作りたいのですがどういった方法が適切ですか?

Rubyで行う予定です

0

1Answer

こんにちは。大枠としてtail -fコマンドの動作がやりたいことに近いのではないかと思いました。

Rubyでの実装とのことなのでこちらのサイトを参考にさせて頂きました
https://memorandums.hatenablog.com/entry/2022/03/09/141903

Google AI Sudioで少し改良したコードをサンプルとして貼り付けさせていただきます

変更した点

  • 一行単位でデータが処理できるようにした
  • 一行に満たないデータが次回読み込み時に繰り越されるようにした
sample.rb
f = open('./log/development.log')

begin
  f.sysseek(-32, IO::SEEK_END)
rescue
  f.sysseek(0, IO::SEEK_SET)
end

buffer = ""  # バッファを用意
while true
  s = ""
  f.sysread(128, s) rescue nil

  if s.size == 0
    # print '.'
    sleep 1
  else
    buffer += s # バッファに追加
    lines = buffer.split("\n")
    buffer = lines.pop || "" # 未処理の行をバッファに残す
    lines.each do |line|
      if line.include?("何らかの文字列")
        puts "処理対象の行: #{line}"
      else
        puts "読み込んだ行: #{line}"
      end
    end
  end
end
2Like

Your answer might help someone💌