我正在使用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数据库。
非常感谢任何帮助!
答案 0 :(得分:0)
鉴于这么多未知因素,你的问题没有明确的答案,但我可以概述如何找到解决方案。
正如您所描述的那样,处理是分阶段完成的(我现在抽象出实际的格式,原因我稍后会描述):
对于每个阶段,都有一些限制因素无法提高处理速度。
对于获取数据,其中一些是:
用于解析数据:
对于数据转换:
用于数据存储:
这些不是限制处理速度的所有因素,而是一些最明显的因素。还有一些其他未知的限制。
在阶段之间传递数据时也可能会有一些开销。这取决于设计。在某些设计中(例如,从远程服务器读取数据,在内存中处理数据并存储到数据库中的单个进程)开销可能为零,但在某些设计中(多个进程读取数据并将其存储到文件中,另一组进程)打开这些文件并处理它们等等)开销可能很大。
最终处理速度由最慢阶段的速度或阶段之间的数据传递速度定义。
当您设计解决方案或在多个设计之间进行选择时,并非所有这些因素都可以预测。鉴于存在未知因素,这更加复杂。
要系统化,我会使用以下方法:
一般情况下,当您尝试优化某些内容时,您需要拥有数字并在进行实验时进行比较。
在线程和进程之间进行选择时应该小心。例如,对于CPU密集型任务,线程为not good。请参阅有关此Multiprocessing vs Threading Python
的更多信息当多个进程使用单个数据库时,SQLite可能有some limitations。您需要检查它是否是您速度的限制因素。也许您需要使用另一个更适合并行性的数据库,然后作为额外的最后一步将数据从单个镜头中转储到SQLite(这只需要按顺序读取数据并将其存储在SQLite中,这可能更有效如果与并行写入单个SQLite DB相比。)