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

2024-05-16 05:46:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个webapi来调用和接收数据,从而为历史能源价格构建一个SQL数据库。在上下文中,能源价格被设定在所谓的“节点”上,每个节点都有20年的历史数据。在

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

作为Python的全新用户(在过去两周内学到的),我最初走的是一条对我更直观的道路:

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

我试图获取的数据的总大小大约是150GB。正因为如此,我希望以异步方式获取数据,并将其格式化/放入SQL,因为它来自数百个API调用(一次只能获得50000行)。我用线程池来做这个。收到数据后,我试图使用ProcessPool将这些数据转换为需要放入SQL数据库的格式,但没有成功。在

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

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

我刚刚在Python中发现了OPENJSON库。这就是我要做的一切吗?在

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

任何帮助都将不胜感激!在


Tags: 数据对象gt数据库jsonhttpsql节点
1条回答
网友
1楼 · 发布于 2024-05-16 05:46:32

有这么多未知数,你的问题没有明确的答案,但我可以概述一下如何找到答案。在

影响绩效的因素

如您所述,处理是分阶段完成的(我现在将抽象出实际的格式,原因稍后再介绍):

  1. 从远程服务获取数据
  2. 解析数据
  3. 转换数据
  4. 存储到本地数据库

对于每个阶段,都有一些限制因素不允许您提高处理速度。在

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

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

用于分析数据:

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

对于数据转换:

  1. RAM数量
  2. CPU功率

对于数据存储:

  1. 磁盘速度
  2. 数据库高效支持的并行级别

这些并不是限制处理速度的所有因素,而是一些最明显的因素。还有一些其他未知的限制。在

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

处理的最终速度由最慢的阶段的速度或阶段之间通过的数据的速度来定义。在

在设计解决方案或在多个设计中进行选择时,并非所有这些因素都可以预测。考虑到还有未知因素,这就更复杂了。在

接近

为了系统化,我将使用以下方法:

  1. 创建简单的解决方案(如单个进程读取数据进程并存储到数据库)
  2. 使用该解决方案求出每个阶段的处理速度
  3. 当你有每个阶段的处理速度时,看看最慢的阶段(注意,只有最慢的阶段才有意义,因为它定义了总体速度)
  4. 然后找到
    • 为什么这么慢?在
    • 是什么限制了速度?如果可以改进的话?在
    • 这个阶段的理论极限是什么?(例如,如果你有一个1Gb的网络和一个处理盒,你不能以超过120MB/s的速度读取数据,实际上它会更小)。在
  5. 改进。改善通常是
    • 优化单处理器的处理(如选择更好的格式或库进行解析,删除可以避免的操作等)。如果达到(或接近)处理速度的理论极限,则不能使用此选项。在
    • 添加更多并行性

一般来说,当你试图优化一些东西时,你需要有一些数字,并在重新做实验。在

平行性

Python

在选择线程和进程时应该小心。例如,对于CPU密集型任务,线程是not good。查看有关此Multiprocessing vs Threading Python的详细信息

SQLite

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

相关问题 更多 >