如何使用Python处理Oracle DB中的1000万条记录。 (cx_Oracle / Pandas)

问题描述 投票:0回答:2

我尝试了cx_Oracle软件包fetchall(),但这最终消耗了大量RAM,也尝试过熊猫,但是如果我们有数十亿条记录,这似乎也没有那么有效。

我的用例-从oracle表中获取每一行到python,进行一些处理并将其加载到另一个表中。PS-期待像fetchmany()之类的东西,尝试了此操作,但无法使其正常工作。

python pandas oracle cx-oracle
2个回答
0
投票

通常,您的策略应如下。

  1. 编写一个SQL查询以获取所需的数据。
  2. 执行查询
  3. 循环:从结果中读取一个元组。
  4. 处理元组。
  5. 将处理后的内容写入目标关系

但是有很多细节需要处理。

通常,在执行这次查询时,您将需要读取数据库的版本。如果您同时写入相同的数据,则会得到一个过时的版本,但不会阻止写入器。如果您需要最新版本,则很难解决。

[执行步骤4时,请勿打开新连接,请重新使用连接。建立新的连接类似于发射战舰。

最好是在目标关系上没有任何索引,因为每次编写元组时都要支付更新目标关系的费用。它可以工作,但是会慢一些。您可以在完成处理后建立索引。

如果此实现对您来说太慢,一种加快处理速度的简单方法是一次处理1000个元组并批量编写。如果那太慢,那么您就进入了数据库性能调优的模糊世界。


0
投票

对于大数据集,由于计算机的内存“太小”,因此您将必须对行集进行批处理,并在获取下一组之前重新插入每组。

调整Cursor.arraysize对于您的抓取性能很重要。该值用于内部缓冲区大小,无论使用Cursor.arraysize还是fetchone()。重新插入值时,请使用fetchmany(),请参阅fetchmany()

最大的问题是您是否甚至需要获取Python信息,或者是否可以在PL / SQL或SQL中进行操作-使用这两者将消除通过网络传输数据的需要,因此效率将大大提高。 。

© www.soinside.com 2019 - 2024. All rights reserved.