Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 努力采取下一步如何存储我的数据_Python_Database_Python 3.x_Nosql - Fatal编程技术网

Python 努力采取下一步如何存储我的数据

Python 努力采取下一步如何存储我的数据,python,database,python-3.x,nosql,Python,Database,Python 3.x,Nosql,我正在努力学习如何存储一些遥测数据流。我玩过很多东西,我发现自己感觉像是在作家的圈子里 问题描述 通过UDP连接,我接收来自不同来源的遥测数据。每个源被分解成一组设备。对于每个设备,我最多要存储5种不同的值类型。它们以每分钟不超过一次的速度进入,并且可能是稀疏的。通过混合边缘/电平触发方案传输值(当值差异足够大或时间足够长时发送数据)。这是一个2级或3级的层次结构,有一个时间序列字典 我最想对数据做的事情是a)访问最新的值,b)枚举时间跨度(begin/end/value)。我真的不在乎数据之间

我正在努力学习如何存储一些遥测数据流。我玩过很多东西,我发现自己感觉像是在作家的圈子里

问题描述 通过UDP连接,我接收来自不同来源的遥测数据。每个源被分解成一组设备。对于每个设备,我最多要存储5种不同的值类型。它们以每分钟不超过一次的速度进入,并且可能是稀疏的。通过混合边缘/电平触发方案传输值(当值差异足够大或时间足够长时发送数据)。这是一个2级或3级的层次结构,有一个时间序列字典

我最想对数据做的事情是a)访问最新的值,b)枚举时间跨度(begin/end/value)。我真的不在乎数据之间有多少“相关性”。我不想计算平均值,也不想计算它们之间的相关性。通常,我查看给定类型的最新值,跨越所有或某些层次结构派生的子集。或者我专注于一个价值流并列举跨度

我根本不是数据库专家。事实上我知道的很少。我的三个同事也不是。我做python(并且希望我做的任何事情都是python 3)。所以我希望我们所做的一切尽可能平易近人。我目前正在尝试使用MintLinux进行开发。我不太在乎酸之类的东西

到目前为止我做了什么
  • 我们的第一个版本使用了Gemstone Smalltalk数据库。构建一个专门的Timeseries对象非常有效。我已经做了很多闲聊,但我的同事没有,宝石系统不仅仅是一个“跳进来,马上快乐”。我们希望远离Smalltalk(尽管我希望市场能让它变得不同)。那就完了

  • 使用RRD(循环数据库)进行播放。这是一种新颖的方法,但我们不需要那么糟糕的压缩,而且由于边缘触发,它不适合我们的数据捕获模型

  • 一位朋友说服我使用sqlite3。我可以再试一次。我的第一次尝试效果不太好。我可能是太聪明了。我试着用“正常化”的方式做事。我发现一开始我的工作还不错。但是,获取设备子集的给定字段的“最新”值(对我来说)是一个棘手的SQL。这样做的速度有点令人失望。所以我也需要学习索引。我发现我陷入了一个我不想钻的洞。回到了Smalltalk数据库的所在地,有很多专业知识,我是唯一能使用它的人

  • 我想我应该走“自己滚”的路线。我的数据并不庞大。磁盘很便宜。而且我非常了解如何读/写文件。文件系统不是分层数据库吗?我相信“知情人士”对这种原始的方法都会不屑一顾,但这种方法是最容易接近的。通过一点python代码,我使用目录进行结构化,然后为每个值使用一个2文件方案(一个用于最新值,一个用于其余值)。这很有效。但我不想为我还没有完全消除的皱纹负责。在如何将数据序列化到/从中(现在仅使用简单字符串)时,涉及的代码同样多。这种方法的一个优点是,虽然我可以编写python脚本来分析数据,但使用经典的命令行工具可以很好地完成一些事情。例如(显示所有最新rssi值的简单查询)

    ls遥测/*/*/rssi| xargs cat

  • 今天早上我花了很多时间在寻找替代方案。在NOSQL网站上生长。仔细阅读表格。扫描ZODB教程。PyTables看起来非常适合我要找的东西。为timeseries建模的命名表的层次结构。但我认为PyTables还不能与python3一起工作(至少,python3还没有debian/ubuntu包)。ZODB也是如此。恐怕我对许多不同的NOSQL数据库所做的事情还不太了解,甚至连一个都不知道

  • 征求意见
    我发现自己比一开始更困惑和困惑。我可能太天真了,以至于我会找到一些更“火与忘”的东西,并在这一点上超越它。如果您有任何建议和指导,我们将不胜感激。如果有人能给我一个食谱,我可以满足我的需要,而不需要大量的开销/教育/进入,我会把它作为肯定的答案。

    好的,我要尝试一下

    我们对大量非结构化数据使用弹性搜索:。我不是这方面的专家,但在我的日常生活中,我非常依赖指数。基本上,您将JSON对象发布到索引中,该索引位于某个服务器上。您可以通过URL或将JSON对象发布到适当的位置来查询索引。我用它来连接索引——这个包有很好的文档记录,您使用的主要类是线程安全的

    查询语言本身非常健壮,但是在发布记录之前,您可以很容易地向索引中的记录添加一个“最新时间”字段


    无论如何,我不认为这值得一个复选标记(即使你走这条路线),但它太长了,无法发表评论。

    我觉得你需要一个磁盘上的、隐式排序的数据结构,比如btree或类似的结构

    也许可以看看:

    http://liw.fi/larch/
    http://www.egenix.com/products/python/mxBase/mxBeeBase/
    

    您的问题不是技术性的,而是糟糕的问题规范

    如果你正在用传感器数据做任何事情,那么旧的实验室格言适用于“如果你不把它写下来,它就不会发生”。在实验室,这意味着笔记本和笔,在电脑上,这意味着酸

    您似乎还过早地优化了解决方案,这是众所周知的。你不会说数据的大小,但你会说它们“不会超过每分钟一次,而且可能是稀疏的”。假设
    id, device_id, valuetype1, valuetype2, valuetype3, ... ,valuetypen, timestamp
    
    INSERT INTO DeviceValueTable (device_id, valuetype1, valuetype2,..., timestamp) 
        SELECT device_id, valuetype1, @new_value, ...., NOW()
            FROM DeviceValueTable
            WHERE device_id = @device_id
            ORDER BY timestamp DESC
            LIMIT 1;
    
    SELECT *
        FROM DeviceValueTable
        WHERE device_id = @device_id         
        ORDER BY timestamp DESC
        LIMIT 1;
    
    select
        DeviceValueTable.*
    from
        DeviceValueTable a
        inner join 
            (select id, max(timestamp) as newest 
             from DeviceValueTable group by device_id) as b on
            a.id = b.id