Как ускорить чтение ZIP-файла CSV и вставки в базу данных SQLite - PullRequest
0 голосов
/ 25 апреля 2019

Я могу прочитать сжатые файлы CSV в память, я могу вставить данные CSV из памяти в базу данных sqlite, но время для этого очень долго. Я провел три испытания: два чтения архива в память и вставку (одно с определением и одно без определения) и одно для извлечения файлов, а затем с помощью csv reader для вставки в базу данных sqlite.

вот результаты: тест 1: zip-файл в код stringIO без определения для вставки в sqlite db

runfile ('C: / python_project_scripts / zipprd_csv_tbl_2 sqlite_db.py', wdir = 'C: / python_project_scripts') иметь соединение дб; Trade-Exports-Chp-47.csv Время выполнения: 1619,531 с

тест 2: zip-файл в код stringIO с def для вставки в sqlite db

runfile ('C: / python_project_scripts / zipprd_csv_tbl_2 sqlite_db.py', wdir = 'C: / python_project_scripts') иметь соединение дб; Trade-Exports-Chp-47.csv Время выполнения: 1627,567 с

тест 3: разархивировать файлы, прочитать CSV-файл и вставить в sqlite db

runfile ('C: / python_project_scripts / zipprd_csv_tbl_2 sqlite_db.py', wdir = 'C: / python_project_scripts') иметь соединение дб; Trade-Exports-Chp-47.csv Время выполнения: 3,559 с

Мой опыт со временем, затраченным на чтение заархивированного файла в память и затем вставку в базу данных sqlite, является общим?

все файлы находятся на жестком диске моего компьютера с использованием windows 7, python 2.7, sqlite3 2.6

~ фрагмент кода:

zfile = zipfile.ZipFile(z)
data = StringIO.StringIO(zfile.read(_file)) #don't forget this line!
if re.match(r'^Trade-.*\ports-Chp.*\.csv$', _file):
# send to read file and insert into db

fieldnames = ['hs_code', 'uom', 'country', 'state', 'prov', 'value', 'quantity', 'year', 'month']

dr = csv.DictReader(os.path.join(DIR_PATH, _file), fieldnames=fieldnames)
to_db = [(i['hs_code'], i['uom'], i['country'], i['state'], i['prov'], i['value'], i['quantity'], i['year'], i['month']) for i in dr]
cur.executemany("INSERT INTO exp_data VALUES (NULL,?,?,?,?,?,?,?,?,?);", to_db)
conn.commit()

~

...