我正在通过Python 3.6中的cx_Oracle库将大量行(约3亿行)写入数据库表。读取多个方案的输入,每个方案都会生成数百万行以写入数据库表。使用下面的WriteToDatabase函数一次可批量写入约500,000行。我发现较大的批次比较小的批次提供了更高的性能。请注意该表在此过程之前被截断。作为参考,这是每批写入速度的样子:Output time
我认为问题可能是由于在func2返回时将不必要的变量存储在内存中而被清除的。因此,我手动删除了不必要的变量,并称为垃圾收集器(gc.collect)。尽管这可以改善性能,但仍然存在性能随时间下降的潜在问题。
def func1(args1):
for xx in range(0,NumberofScenarios):
def func2(args2,xx):
#Perform analysis using xx
def func3(args3):
del unnecessary_variables
gc.collect()
WriteToDatabase(curs, ListofTuples):
func3(args3)
func2(args2,xx)
def WriteToDatabase(curs, ListofTuples):
curs.executemany("""
insert /*+ APPEND_VALUES NOLOGGING*/ into table1
(col1, col2, col3, col4, col5)
values (:1,:2,:3,:4,:5)
""", ListofTuples
)
我不明白为什么从函数(func2)中返回和调用会影响写入数据库的性能。
关于导致此问题的原因和解决方法的任何想法?