Jump to content
Che

[Python] Optimizare script csv to SQLite sa fie mai rapid ?

Recommended Posts

Salut !

 

Am facut urmatorul script in python care iti ia fiecare fisier csv si ti-l baga intr-o baza de date SQLite.

Fisierele originale csv sunt destul de marisoare (~50-60mb) fiecare.

Dar am incercat pe niste fisiere mult mai mici (de 400kb -450kb) fiecare si sta extraordinar de mult pana le baga in baza de date. Nu am pus o mie de astfel de fisiere ci doar 5 si sta deja o ora si tot nu a terminat de bagat in baza de date.

Nu as vrea sa stau ani de zile in cazul fisierelor originale.

Ma gandesc ca poate gresesc pe undeva de merge asa de greu.

Va rog, poate ma puteti ajuta.

Aici este scriptul:

# coding: utf-8
import json
import os
import sqlite3
from csv import reader
from os import listdir

import unicodecsv as csv
from os.path import isfile, join

# ne conectam la baza de date, daca aceasta nu exista atunci o cream mai intai si apoi ne conectam
# aceasta va fi creata automat, daca nu exista, la prima conectare:
conn = sqlite3.connect(myfiles_path + 'mydatabase.db')

# se creaza instanta de acces catre baza de date:
c = conn.cursor()

for each_csv_file_found in csv_list_files:
    # ca sa stim cam pe unde se afla:
    print "Bagam in baza de date fisierul csv: {}".format(each_csv_file_found)
    csv_headers = read_csv_headers(myfiles_path + each_csv_file_found)
    beta_rows = getCSV_rows(myfiles_path + each_csv_file_found)
    final_columns = ', '.join(csv_headers)
    # se genereaza numele tabelului de introdus in baza de date:
    table_name = each_csv_file_found.rsplit('.', 1)[0].replace("Total_", '').replace("mins", "").replace("-", "_")
    values_to_insert = []
    for each_beta_row in beta_rows:
        values_to_insert.append(tuple(each_beta_row))
    # se va crea un tabel dupa fiecare fisier csv gasit, doar daca acesta nu exista:
    sql_command_create_table = '''CREATE TABLE IF NOT EXISTS {}({})'''.format(table_name, final_columns)
    c.execute(sql_command_create_table)
    # Nu se face Create unique index fiindca le amesteca si le combina aiurea pe toate si mai si sare din ele!
    # save changes:
    # Trebuie executata dupa fiecare c.execute si nu doar la final!
    conn.commit()
    # incepem sa construim query pentru adaugarea de valori in db:
    semne = "?" * len(csv_headers)
    question_marks = ",".join(semne)
    conn.text_factory = str
    for row_value in values_to_insert:
        # Nu trebuie cu REPLACE INTO fiindca iti baga mai multe randuri asemanatoare intr-un singur rand!
        # c.execute('INSERT team_summary_overall ({}) VALUES ({})'.format(final_columns, question_marks), row_values)
        c.execute('INSERT INTO {} ({}) VALUES ({})'.format(table_name, final_columns, question_marks), row_value)
        # save changes:
        # Trebuie dupa fiecare c.execute si nu la sfarsit!
        conn.commit()

# inchidem conexiunea la baza de date:
# se executa o singura data, la final:
conn.close()

Folosesc unicodecsv fiindca csv normal imi da eroare la scrierea datelor ca sunt litere de astea si imi da eroare ca nu poate citi ascii in pozitia x, ceva de genul "can't decode ascii x08x\67...". Si am stat o zi intreaga si altfel nu am reusit sa rezolv problema decat folosind unicodecsv.

 

Multumesc mult de tot !

Link to comment
Share on other sites

Gata, am rezolvat. Folosesc acum c.executemany(sqlite_command).

Totusi, cu pandas nu imi da voie ca imi da o eroare ca numarul de coloane nu e egal... (?!). Ciudat. Zic fiindca am vazut o metoda mult mai simpla folosind pandas.

Oricum, am rezolvat.

Multumesc pentru ajutor! (Nu era treaba cu CTL-urile.)

Link to comment
Share on other sites

16 hours ago, Wav3 said:

Nu e mai simplu sa folosesti php? Eu lucrez cu feeduri csv de sute de mb si le bag una-doua in baza.

Comentariile sunt cringe rau

Poate o sa folosesc php dar momentan nu imi e indemana ca nu am mai scris nimic in php de peste 5 ani.

Multumesc!

Da, m-am gandit sa imi comentez cat mai explicit codul ca nu programez tot timpul si cand ma apuca am observat ca nici eu nu mai stiam ce am vrut sa scriu acolo. :))

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...