Я нашел одно решение, которое значительно ускоряет транзакцию.Я использовал ответы из: 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)