Как сделать мой код для массовой загрузки более эффективным? - PullRequest
0 голосов
/ 10 октября 2019

Я написал скрипт на python для массовой загрузки файлов из папки в postgresql. Хотя скрипт работает, я не думаю, что он супер эффективен. Может кто-нибудь сказать мне, как его улучшить?

На самом деле для загрузки файлов требуется очень много времени.

Интервал / отступ немного отключен при публикации, это не проблема вфактический скрипт.


def addFilesToDatabase (directory):

uploadedFiles = []
errorFiles = []

rows_to_chunk_by = 1000

for filename in os.listdir(directory):
    try:
        filename_used = filename.upper()

        if filename_used.endswith(".CSV"):
            file_directory = os.path.join(directory, filename)
            tableName = filename_used.replace('.CSV','')
            df = pd.read_csv(file_directory, header=0, nrows = 1)
            columns = df.columns
            while 1==1:
                for skiprows in range(100000000):
                    if(skiprows == 0):
                        df = pd.read_csv(file_directory, header=0, nrows = rows_to_chunk_by, skiprows = skiprows*rows_to_chunk_by)
                        df.to_sql(name=tableName, con=engine, if_exists='append', schema=None, index=False)
                    else:
                        df = pd.read_csv(file_directory, header=None, nrows = rows_to_chunk_by, skiprows = skiprows*rows_to_chunk_by)
                        df.columns = columns
                        df.to_sql(name=tableName, con=engine, if_exists='append', schema=None, index=False)
                        if(len(df)<rows_to_chunk_by):
                            break
                uploadedFiles.append(filename)
                break
   except Exception as e:
        if str(e) == "No columns to parse from file":
            uploadedFiles.append(filename)
        elif str(e)[0:16] == "Length mismatch:":
            uploadedFiles.append(filename)
        else:
            errorFiles.append(filename)
            print('Error with ' + filename)
            print(e)
            continue
...