Python 优化读取非常大的csv并将其写入SQLite

Python 优化读取非常大的csv并将其写入SQLite,python,sqlite,csv,bigdata,Python,Sqlite,Csv,Bigdata,我有一个10gb的csv文件,其中包含用户ID和性别,有时会重复 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'''

我有一个10gb的csv文件,其中包含用户ID和性别,有时会重复

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()
现在,处理1MB文件需要10秒钟(实际上,我有更多的列,也创建了更多的表)。
我不认为可以使用pd.to_sql,因为我想要一个主键。

而不是使用
游标。对每一行执行
,使用
游标。executemany
并一次插入所有数据

格式存储您的值\u list=[(a,b,c…)(a2,b2,c2…)(a3,b3,c3…)

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


该列表不是比我的RAM大吗?您可以使用计数器分解列表,然后执行多个ExecuteManyTank。它的运行速度仍然比pd.to_sql慢5倍以上。正确的方法是为
executemany()
提供一个迭代器,用于动态读取和转换CSV中的数据。您能提供一个更详细的答案吗?非常感谢。