【问题标题】:How to load csv file to Oracle table in faster way using Python如何使用 Python 以更快的方式将 csv 文件加载到 Oracle 表中
【发布时间】:2021-10-06 15:26:05
【问题描述】:

我正在互联网上研究如何以更快的方式将 CSV 文件加载到 Oracle DB 表中

以下是我加载表的方式,该表作为文件中的 1000 条记录并很快被加载。

但如果有 50,000 条记录,则大约需要 50,000 条记录。 5 分钟加载。

有没有更快更有效的方式将 csv 文件加载到 Oracle 表中?

我的代码:

import cx_Oracle
import csv

myquery='insert into TABLE (COLUMNNAME1,COLUMNNAME2,COLUMNNAME3,COLUMNNAME4,COLUMNNAME5,COLUMNNAME6) values (:1, :2, :3 ,:4,:5,:6)'
separator='|'

oracleConnection='user/password@hostIP/database'

def fileLoading(oracleconnection, file_name,myquery,separator):
    try:
        con = cx_Oracle.connect(oracleConnection)
        print("Connection established")
        reader = csv.reader(open("demp.csv", "r"), header=None,delimiter=separator)
        columns = []
        for line in reader:
            columns.append(line)
            cur = con.cursor()
            for line in columns:
                print("Inserting record to table")
                insrt_stmt = myquery
                cur.execute(insrt_stmt, line)
                con.commit()
                cur.close()
                print("load completed")
    except Exception as er:
        print('ERRO:',er)

【问题讨论】:

  • 该速率对应于您的 1000 条记录需要 6 秒,有些人可能认为“没有时间”。
  • 因为这是 Oracle,我会使用 SQL Loader,它真的是 fast
  • 您可以尝试 cursor.executemany 来帮助提高速度,也可以尝试使用一个提交语句。
  • 删除“打印”。仅在循环外使用一次insrt_stmt = myquery。最后只使用一个commit。只打开和关闭一次光标。

标签: python oracle csv cx-oracle


【解决方案1】:

我不熟悉python,但我会这样尝试:

con = cx_Oracle.connect(oracleConnection)
print("Connection established")
reader = csv.reader(open("demp.csv", "r"), header=None,delimiter=separator)
cur = con.cursor()
insrt_stmt = myquery

for line in reader:
   columns = []
   for line in columns:
       columns.append(line)
       cur.execute(insrt_stmt, line)
con.commit()
cur.close()
print("load completed")

【讨论】:

  • 不!使用executeMany(),这比重复调用execute()快得多
【解决方案2】:

使用executeMany(),如documentation 所示。这比重复调用execute() 快​​得多:

import cx_Oracle
import csv

. . .

# Predefine the memory areas to match the table definition
cursor.setinputsizes(None, 25)

# Adjust the batch size to meet your memory and performance requirements
batch_size = 10000

with open('testsp.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    sql = "insert into test (id,name) values (:1, :2)"
    data = []
    for line in csv_reader:
        data.append((line[0], line[1]))
        if len(data) % batch_size == 0:
            cursor.executemany(sql, data)
            data = []
    if data:
        cursor.executemany(sql, data)
    con.commit()

【讨论】:

  • 您能否在此处提供您的输入:使用执行许多 stackoverflow.com/questions/68607481/… 和代码改进使我的代码正常工作,但未将数据加载到表中,但未加载到表中
  • 首先阅读文档,确保您有正确的setinputsizes 值(对于简单测试,只需删除该行),尝试仅使用几行数据,告诉我们您是否遇到错误等
猜你喜欢
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多