使用Python将HTTP请求响应发送到SQLite3数据库的最有效方法是什么?

时间:2018-03-17 21:34:24

标签: python json api http sqlite

我正在使用Web API来调用和接收数据,以构建用于历史能源价格的SQL数据库。对于上下文,能源价格设置在所谓的“节点”,每个节点有20年的历史数据。

我可以接收JSON或XML格式的数据。在将其放入SQL数据库之前,我需要对接收到的数据执行一次操作。也就是说,我需要将东部夏令时给出的每小时转换回其东部标准时间等值。

作为Python的新手(在过去两周内学到的东西),我最初走向了一条更直观的道路:

HTTP请求(XML格式) - >在Python中解析为XML对象 - >转换日期时间 - >放在SQL数据库中

我试图获得的数据总大小约为150GB。因此,我希望将数据以异步方式和格式化/放入SQL中,因为它来自数百个API调用(对于我一次可以得到的内容有50000行限制)。我使用ThreadPool来做到这一点。收到数据后,我尝试使用ProcessPool将这些数据转换为我需要放入SQL数据库的格式,但是没有成功。

从高层次看这个过程,我认为这个过程可以更有效率。我想我可以做到以下几点:

HTTP请求(JSON格式) - >在Python中解析为JSON对象 - >执行操作以转换日期时间(使用字典映射值?) - >放入SQL数据库

我刚刚在Python中发现了OPENJSON库。这就是我需要做的全部吗?

我需要研究的另一个问题是SQLite3的局限性。每个节点在我的数据库中都有自己的表,所以理想情况下我想让尽可能多的程序实例获取,解析并将数据放入我的SQLite3数据库。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

鉴于这么多未知因素,你的问题没有明确的答案,但我可以概述如何找到解决方案。

影响绩效的因素

正如您所描述的那样,处理是分阶段完成的(我现在抽象出实际的格式,原因我稍后会描述):

  1. 从远程服务中获取数据
  2. 解析数据
  3. 转换数据
  4. 存储到本地数据库
  5. 对于每个阶段,都有一些限制因素无法提高处理速度。

    对于获取数据,其中一些是:

    1. 网络带宽。
    2. 远程服务器支持的并行性:远程服务器可能会限制单个用户的连接和/或总速度,或者可能需要使用条款来限制客户端。
    3. 下载时使用的数据格式。不同的格式添加了他们自己的不需要/样板格式和/或通过网络发送的数据。它取决于服务及其API,但可能是返回的XML小于JSON,因此即使XML对于您的特定情况通常更加冗长XML也更好。
    4. RAM量(和交换速度)可能是您的系统限制(非常不可能),因为#1和#2因素不会限制您。在这种情况下,下载的日期可能不适合RAM并将被交换到磁盘,这将减慢下载过程。
    5. 用于解析数据:

      1. RAM金额(原因与上述相同)
      2. 使用的数据格式。
      3. 使用了解析器。例如,JSON的不同解析器实现具有不同的速度。
      4. CPU功率:处理单元的速度和数量。
      5. 对于数据转换:

        1. RAM金额
        2. CPU power
        3. 用于数据存储:

          1. 磁盘速度
          2. DB有效支持的并行度级别
          3. 这些不是限制处理速度的所有因素,而是一些最明显的因素。还有一些其他未知的限制。

            在阶段之间传递数据时也可能会有一些开销。这取决于设计。在某些设计中(例如,从远程服务器读取数据,在内存中处理数据并存储到数据库中的单个进程)开销可能为零,但在某些设计中(多个进程读取数据并将其存储到文件中,另一组进程)打开这些文件并处理它们等等)开销可能很大。

            最终处理速度由最慢阶段的速度或阶段之间的数据传递速度定义。

            当您设计解决方案或在多个设计之间进行选择时,并非所有这些因素都可以预测。鉴于存在未知因素,这更加复杂。

            方法

            要系统化,我会使用以下方法:

            1. 创建简单的解决方案(如单个进程读取数据进程并存储到数据库)
            2. 使用该解决方案找到每个阶段的处理速度
            3. 当你将每个阶段的处理速度看到最慢阶段时(请注意,只有在定义整体速度时才能看起来最慢)
            4. 然后找到
              • 为什么它很慢?
              • 什么限制了速度以及是否可以改进?
              • 那个阶段的理论极限是多少? (例如,如果你有1Gb网络和一个处理盒,你就无法读取速度大于120MB / s的数据,实际上它会更小)。
            5. 提高。通常会有所改善
              • 优化单处理器的处理(如选择更好的格式或库进行解析,删除可以避免的操作等)。如果您达到(或接近)处理速度的理论极限,则无法使用此选项。
              • 添加更多并行度
            6. 一般情况下,当您尝试优化某些内容时,您需要拥有数字并在进行实验时进行比较。

              并行

              的Python

              在线程和进程之间进行选择时应该小心。例如,对于CPU密集型任务,线程为not good。请参阅有关此Multiprocessing vs Threading Python

              的更多信息

              SQLite的

              当多个进程使用单个数据库时,SQLite可能有some limitations。您需要检查它是否是您速度的限制因素。也许您需要使用另一个更适合并行性的数据库,然后作为额外的最后一步将数据从单个镜头中转储到SQLite(这只需要按顺序读取数据并将其存储在SQLite中,这可能更有效如果与并行写入单个SQLite DB相比。)