Загрузка части текстового файла ascii в таблицу PostgreSQL

1

Я пытаюсь загрузить часть текстового файла в таблицу базы данных. Текстовый файл составляет около 12 ГБ. Скриншот текстового файла. Я разбираю текстовый файл по строкам и вставляю его в таблицу.

Ниже приведен код, который я использую для загрузки данных:

import psycopg2 as pg
import os
import datetime

sub_column_list = ['', 'SUB', 'GIS', 'MO', 'DA', 'YR', 'AREAkm2', 'PRECIPmm', 'SNOMELTmm', 'PETmm', 'ETmm', 'SWmm', 'PERCmm',
          'SURQmm', 'GW_Qmm', 'WYLDmm', 'SYLDt/ha', 'ORGNkg/ha', 'ORGPkg/ha', 'NSURQkg/ha', 'SOLPkg/ha',
          'SEDPkg/ha', 'LATQmm', 'LATNO3kg/ha', 'GWNO3kg/ha', 'CHOLAmic/L', 'CBODUmg/L', 'DOXQmg/L', 'TNO3kg/ha']

sub_vars = ['PRECIPmm', 'PETmm', 'ETmm', 'SWmm', 'SURQmm']

conn = psycopg2.connect('dbname=swat_db user=admin password=pass host=localhost port=5435')

cur = conn.cursor()

watershed_id = 1
if file.endswith('.sub'):

    sub_path = os.path.join(output_path, file)
    f = open(sub_path)
    for skip_line in f:
        if 'AREAkm2' in skip_line:
            break

    for num, line in enumerate(f, 1):
        line = str(line.strip())
        columns = line.split()
        for idx, item in enumerate(sub_vars):
            sub = int(columns[1])
            dt = datetime.date(int(columns[5]), int(columns[3]), int(columns[4]))
            var_name = item
            val = float(columns[sub_column_list.index(item)])
            cur.execute("""INSERT INTO output_sub (watershed_id, month_day_year, sub_id, var_name, val)
                         VALUES ({0}, '{1}', {2}, '{3}', {4})""".format(watershed_id, dt, sub, var_name, val))

        conn.commit()
    conn.close()

Sub_column_list - это список всех столбцов в текстовом файле. Список sub_vars - это список переменных, которые я хотел бы поместить в базу данных. Этот подход занимает очень много времени, чтобы вставить значения в базу данных. Что было бы хорошим способом повысить скорость, с которой значения вставляются в базу данных?

Теги:
psycopg2

1 ответ

0

Первое, что я заметил, - это вы дважды просматриваете файл. Однажды для AREAkm2 Search, а затем снова начните и начните сбрасывать в вашу базу данных. Может быть, это то, что вы хотели?

if file.endswith('.sub'):

    sub_path = os.path.join(output_path, file)
    f = open(sub_path)
    for num, line in enumerate(f):
        if 'AREAkm2' in line:
            continue
        line = str(line.strip())
        columns = line.split()
        for idx, item in enumerate(sub_vars):
            sub = int(columns[1])
            dt = datetime.date(int(columns[5]), int(columns[3]), int(columns[4]))
            var_name = item
            val = float(columns[sub_column_list.index(item)])
            cur.execute("""INSERT INTO output_sub (watershed_id, month_day_year, sub_id, var_name, val)
                         VALUES ({0}, '{1}', {2}, '{3}', {4})""".format(watershed_id, dt, sub, var_name, val))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню