Оптимизация чтения очень больших CSV и записи его в SQLite - PullRequest
0 голосов
/ 15 мая 2018

У меня есть 10gb CSV-файл с идентификаторами пользователей и полов, которые иногда дублируются.

userID,gender
372,f
37261,m
23,m
4725,f
...

Вот мой код для импорта csv и записи его в базу данных SQLite:

import sqlite3
import csv


path = 'genders.csv'
user_table = 'Users'

conn = sqlite3.connect('db.sqlite')
cur = conn.cursor()

cur.execute(f'''DROP TABLE IF EXISTS {user_table}''')

cur.execute(f'''CREATE TABLE {user_table} (
            userID INTEGER NOT NULL, 
            gender INTEGER,
            PRIMARY KEY (userID))''')

with open(path) as csvfile:
    datareader = csv.reader(csvfile)
    # skip header        
    next(datareader, None)
    for counter, line in enumerate(datareader):
        # change gender string to integer
        line[1] = 1 if line[1] == 'f' else 0

        cur.execute(f'''INSERT OR IGNORE INTO {user_table} (userID, gender) 
                    VALUES ({int(line[0])}, {int(line[1])})''')

conn.commit()
conn.close()

На данный момент обработка файла размером 1 МБ занимает 10 секунд (на самом деле у меня больше столбцов, а также я создаю больше таблиц). Я не думаю, что pd.to_sql можно использовать, потому что я хочу иметь первичный ключ.

1 Ответ

0 голосов
/ 15 мая 2018

Вместо использования cursor.execute для каждой строки, используйте cursor.executemany и вставьте все данные сразу.

Сохраните ваши значения в формате _list=[(a,b,c..),(a2,b2,c2...),(a3,b3,c3...)......]

cursor.executemany('''INSERT OR IGNORE INTO {user_table} (userID, gender,...) 
                    VALUES (?,?,...)''',(_list))
conn.commit()

Информация:

https://docs.python.org/2/library/sqlite3.html#module-sqlite3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...