Вставка миллионов строк в таблицу SQLite3 с использованием Flask-SQLAlchamy и Python3 - PullRequest
0 голосов
/ 25 июня 2018

Как я могу вставить миллионы или строки из файла .txt в базу данных SQLite3 с помощью Flask-SQLAlchemy? Я попытался просто прочитать одну строку за раз из файла .txt и добавить и зафиксировать их в цикле, но заметил, что это занимает огромное количество времени. Как я могу сделать это эффективно? Я пытался реализовать это решение https://stackoverflow.com/a/7137270 в своем коде, но не смог заставить его работать.

Схема таблицы выглядит следующим образом:

class table(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    col1 = db.Column(db.Integer)
    col2 = db.Column(db.Integer)
    col3 = db.Column(db.String(50))
    col4 = db.Column(db.String(50))
    col5 = db.Column(db.String(50))
    col6 = db.Column(db.Integer)
    col7 = db.Column(db.String(50))
    col8 = db.Column(db.Integer)
    col9 = db.Column(db.Integer)
    col10 = db.Column(db.Integer)
    col11 = db.Column(db.Integer)
    col12 = db.Column(db.Integer)

Строки в файле .txt выглядят так:

hjk;28770930;Y;T;C;;asd;;1;1233;1233;0.00081103

И есть около 85 миллионов строк, которые нужно добавить в базу данных.

1 Ответ

0 голосов
/ 26 июня 2018

Я нашел одно решение, которое значительно ускоряет транзакцию.Я использовал ответы из: https://stackoverflow.com/a/7137270/9988919 https://stackoverflow.com/a/32271651/9988919

Вместо того, чтобы читать по одной строке за раз и писать по одной строке на каждой итерации, я использую функцию def chunks(), чтобы разделить файл на куски иприносящий генератор.Затем в функции asdasd зацикливание чанков и фиксация после каждого чанка, содержащего 10000 строк.

Мне все равно было бы интересно узнать, может ли кто-нибудь найти более быстрый способ, потому что это также займет примерно 5 часов.

Вот мой код:

def chunks(data, n=10000):
    buffer = [None] * n
    idx = 0
    for record in data:
        buffer[idx] = record
        idx += 1
        if idx == n:
            yield buffer
            buffer = [None] * n
            idx = 0
    if idx > 0:
        yield buffer[:idx]

def load_data_table(filename):
    rows = 0
    csvData = csv.reader(open('./folder/{}'.format(filename), "r"), delimiter=";")
    dataset = tables.query.filter_by(id=1).first()
    divData = chunks(csvData)  # divide into 10000 rows each

    for chunk in divData:
        for col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12 in chunk:
            add_new = table(col1=col1, col2=col2, col3=col3, col4=col4, col5=col5, col6=col6, col7=col7, col8=col8, col9=col9, col10=col10, col11=col11, col12=col12)
            db.session.add(add_new)
        db.session.commit()
        rows += 10000
        print(rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...