【问题标题】:Is there any way to load data dynamically into a python datastructure without recreating有没有办法在不重新创建的情况下将数据动态加载到 python 数据结构中
【发布时间】:2010-01-09 18:07:21
【问题描述】:

我有一个从数据库表构建列表并实时运行的过程。时不时地将新数据添加到数据库表中。时不时从表中查询数据既麻烦又耗时,而且需要尽可能实时。解决问题的正确方法是什么?

流程如下

列表是从一个需要 2-4 秒执行的 SQL 查询构建的。

进程A使用List来执行一些功能

数据不断添加到数据库表中。我们只需要将新数据附加到列表中,进程 A 将实时使用这些数据。

我还没有尝试编写任何代码,我仍然不确定它应该是什么样的设计。 Python 是我们唯一可以使用的语言,因为已经部署了 10,000 行 Python 代码作为系统的一部分。

有人可以帮助我使用正确的方法、模块等吗?

编辑

进程 A 是程序中的一个过程。我正在考虑的 Pusedo 代码是这样的

def processA(list):
   while 1:
      parse file 
      do something

def run():
   list = generate list from run sql query
   processA(list)


if __name__=="__main__":
   run()

【问题讨论】:

  • 当你说“进程A”时,你的意思是“过程”还是“程序/线程”?
  • 1.这只是关于添加数据,还是关于改变? 2. 列上有自增键吗?
  • 您使用的是什么数据库系统?我不了解其他 RDBMS,但 Oracle 实际上会让您订阅数据库事件,例如您可以处理的行插入。 cx_Oracle 在今年早些时候增加了对该功能的支持。

标签: python dynamic-data real-time


【解决方案1】:

再次查询数据库以获取自上次查询以来出现的所有新数据是否有意义? key > highest_key_in_listdate > highest_date_in_list 之类的东西,而不是再次加载整个内容。

【讨论】:

  • Noufal,我确实尝试过这个作为测试代码。但是任何仍然需要跨越 50 万条记录的 SQL 查询都需要时间,并且可能需要内存。我看到的开销是连接到数据库然后查询,当数据库表很大时。
【解决方案2】:

这感觉有点骇人听闻,但在您的初始查询中创建一个临时表来保存结果。在该表中添加一个列,该列是一个递增的数字,我将其称为 id。将触发器添加到表中,数据更改会更新您的临时表。检查数据库并仅查询 id 大于初始拉取中最后一个元素的记录。由于这将是一个更快的查询,它应该让您尽可能接近实时。重用持久连接也可能有所帮助。

我还会检查您的数据库是否为该查询建立了良好的索引,2-4 秒似乎很长。也许你也可以稍微优化一下你的查询。

【讨论】:

  • 谢谢。我有想过这样的想法
【解决方案3】:

抱歉,很难确切地推断出您想要做什么。

有一点不太清楚:
是否要运行进程(python 脚本?)

  • 连续(类似守护进程),- 在这种情况下,如果数据集相对较小,则无需将其存储在任何地方。您可以将其保留在内存中。
  • 定期(cron 作业)- 在这种情况下,您确实需要一种方法来在每次调用之间序列化数据。您可以为此使用 pickle,但我不确定 unpickling 是否会比从数据库中检索整个数据集花费更少的时间。

重置取决于您的数据库架构以及添加/更新数据的方式。插入后是否发生了突变?如果没有,您只能选择“自上次调用以来”的数据,方法是使用表中的时间戳字段(如果有)或身份字段(实际上不可靠。它是 某种 MySQL 是可靠的,但话又说回来,不完全)。

如果数据可能会更新,那么您将不得不重新读取整个数据集(除非您有办法只选择新的/更新的条目)。

至于 2-4 秒,- 可能有很多原因导致需要这么长时间,- 您是否正在运行查询,提到未索引的字段?

【讨论】:

    【解决方案4】:

    如果程序中数据正在添加到表中,只需将其同时添加到列表中即可。

    如果向表中添加了多个来源,请在表中查询其主键为 > 您检索的最后一个键的所有记录。

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 2021-08-10
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多