Пакетная запись в базу данных через cx_Oracle постепенно замедляется - PullRequest
1 голос
/ 20 июня 2019

Я записываю большое количество строк (~ 300 миллионов) в таблицу базы данных через библиотеку cx_Oracle в Python 3.6.Входные данные считываются для ряда сценариев, при этом каждый сценарий генерирует миллионы строк для записи в таблицу базы данных.Строки записываются в пакетах по ~ 500 000 строк за раз, используя функцию WriteToDatabase ниже.Я обнаружил, что большие партии обеспечивают большую производительность, чем меньшие партии.Обратите внимание, что таблица обрезается до этого процесса.Для справки, вот как выглядит скорость записи для пакета: Время вывода

Я думал, что проблема может быть связана с сохранением в памяти ненужных переменных, которые очищаются при возврате 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) могут повлиять на производительность записи в базу данных..

Есть идеи, что является причиной проблемы и как ее решить?

...