1

我正在使用 Ruby on Rails 3.2.13,我必须存储和处理定期发送到我的服务器的提要数据。我想以适当的方式存储该数据,因为计划该数据将用于构建和显示折线图。我的问题主要与通过关心系统性能(因为数据每 30 秒发送到服务器并且可能超过 5000 个字符)和保持数据操作的便利性(因为数据包括哈希数组结构)在数据库中存储数据有关)。

也就是说,我的服务器会定期接收 Ruby on Rails 识别的数据(在 HTTP 请求查询字符串中),如下所示:

Parameters:
{
  "feed1"=>{
    "1"=>"A,35,text1.1,5",
    "2"=>"B,76,text1.2,-6",
    "3"=>"D,45,text1.3,-1",
    "4"=>"Z,48,text1.4,-10",
    "5"=>"G,26,text1.5,-999",
    "6"=>"Y,10,text1.6,-67",
    "7"=>"T,98,text1.7,45",
    "8"=>"N,04,text1.8,315", 
    "9"=>"E,37,text1.9,90"
  },
  "feed2"=>{
    "1"=>"T,53,text2.1,76",
    "2"=>"J,67,text2.2,85",
    "3"=>"O,54,text2.3,-967",
    "4"=>"D,85,text2.4,41",
    "5"=>"N,97,text2.5,99",
    "6"=>"P,32,text2.6,48",
    "7"=>"Z,87,text2.7,21",
    "8"=>"S,27,text2.8,3", 
    "9"=>"I,67,text2.9,0"
  },
  "..."=>{...}
}   

我想以“智能”方式存储上述数据,并以有效的方式处理这些数据,以便在折线图中显示。

我怎么能/应该做到这一点?有什么药方或建议吗?

例如:

  • 我应该为每个传入的提要数据请求(每 30 秒!)创建一个数据库行吗?
  • 由于我想以 char 形式显示过去 24 小时的数据,我应该如何管理这段时间的数据?删除“旧”值?更新这些值?或者是什么?
  • 为了节省性能和数据库内存,我想使用Rails 序列化功能。我应该继续序列化吗?或者,还有什么可能是另一种解决方案?
4

1 回答 1

1

假设每个提要都是一个简单的哈希,我认为为此目的而流行的格式是标签制表符分隔值 (LTSV)。也就是说,一个哈希:

{"a" => "foo", "b" => "bar", "c" => "baz"}

将被记录为一行:

a:foo\tb:bar\bc:baz\n

在您的情况下,您可以"time"像这样将属性添加到每个提要中:

{
  "time"=>2013-07-21 02:24:01 +0900,
  "1"=>"A,35,text1.1,5",
  "2"=>"B,76,text1.2,-6",
  "3"=>"D,45,text1.3,-1",
  "4"=>"Z,48,text1.4,-10",
  "5"=>"G,26,text1.5,-999",
  "6"=>"Y,10,text1.6,-67",
  "7"=>"T,98,text1.7,45",
  "8"=>"N,04,text1.8,315", 
  "9"=>"E,37,text1.9,90"
},
...

并将其存储在 LTSV 中。对 LTSV 进行编码和解码的代码很简单:

class Hash
  def to_ltsv
    map{|k, v| "#{k}:#{v.to_s.tr("\t", " ")}"}.join("\t")
  end
end

class String
  def parse_ltsv; Hash[chomp.split("\t").map{|f| f.split(":", 2)}] end
end

而且由于它被记录为文本文件,因此比使用数据库软件要快。

于 2013-07-20T17:27:39.277 回答