Python:在Postgres中插入大数据帧(1.2M行)的问题

Python:在Postgres中插入大数据帧(1.2M行)的问题,python,pandas,postgresql,sqlalchemy,Python,Pandas,Postgresql,Sqlalchemy,我正在使用Pandas insert方法()获取从.mdb文件转换的CSV,并将它们插入Postgres。我试图转换的其中一个表有120万行,超过了EC2实例的CPU能力。是否有办法修改或分解此函数以处理此大小的CSV?其他150K-300K行的表工作正常。谢谢 import csv from io import StringIO from sqlalchemy import create_engine def psql_insert_copy(table, conn, keys, data_

我正在使用Pandas insert方法()获取从.mdb文件转换的CSV,并将它们插入Postgres。我试图转换的其中一个表有120万行,超过了EC2实例的CPU能力。是否有办法修改或分解此函数以处理此大小的CSV?其他150K-300K行的表工作正常。谢谢

import csv
from io import StringIO
from sqlalchemy import create_engine

def psql_insert_copy(table, conn, keys, data_iter):
    # gets a DBAPI connection that can provide a cursor
    dbapi_conn = conn.connection
    with dbapi_conn.cursor() as cur:
        s_buf = StringIO()
        writer = csv.writer(s_buf)
        writer.writerows(data_iter)
        s_buf.seek(0)

        columns = ', '.join('"{}"'.format(k) for k in keys)
        if table.schema:
            table_name = '{}.{}'.format(table.schema, table.name)
        else:
            table_name = table.name

        sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
            table_name, columns)
        cur.copy_expert(sql=sql, file=s_buf)

def df_to_postgres(table_name, dataframe):

    df = dataframe

    engine = create_engine(f'postgresql://{PGusername}:{PGpassword}@{PGendpoint}:5432/testDB')

    df.to_sql(table_name.lower(), engine, if_exists='replace', method=psql_insert_copy)

编辑:我在df.to_sql语句中添加了一个chucksize参数,但仍然得到一个内存错误。错误注释如下

  File "20191217_Access2PG.py", line 122, in <module>
    filter_mdb(args.bucket,args.profile)
  File "20191217_Access2PG.py", line 119, in filter_mdb
    s3_download(bucket, mdbList)
  File "20191217_Access2PG.py", line 103, in s3_download
    get_tables(path)
  File "20191217_Access2PG.py", line 84, in get_tables
    table_data(table_names)
  File "20191217_Access2PG.py", line 69, in table_data
    df_to_postgres(item, csv_file)
  File "20191217_Access2PG.py", line 48, in df_to_postgres
    df.to_sql(table_name.lower(), engine, if_exists='replace', method=psql_insert_copy)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2712, in to_sql
    method=method,
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py", line 518, in to_sql
    method=method,
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py", line 1320, in to_sql
    table.insert(chunksize, method=method)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py", line 734, in insert
    keys, data_list = self.insert_data()
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/io/sql.py", line 710, in insert_data
    d = np.array(b.get_values(), dtype=object)
MemoryError```
文件“20191217_Access2PG.py”,第122行,在
过滤器\u mdb(参数存储桶、参数配置文件)
文件“20191217_Access2PG.py”,第119行,在filter_mdb中
s3_下载(bucket,mdbList)
文件“20191217_Access2PG.py”,第103行,s3_下载
获取表(路径)
get_表格中第84行的文件“20191217_Access2PG.py”
表格数据(表格名称)
文件“20191217_Access2PG.py”,第69行,在表_数据中
df_至_postgres(项目、csv_文件)
文件“20191217_Access2PG.py”,第48行,df_to_postgres
df.to_sql(table_name.lower(),引擎,if_exists='replace',method=psql\u insert\u copy)
文件“/home/ubuntu/anaconda3/lib/python3.6/site packages/pandas/core/generic.py”,第2712行,在to_sql中
方法=方法,
文件“/home/ubuntu/anaconda3/lib/python3.6/site packages/pandas/io/sql.py”,第518行,在to_sql中
方法=方法,
文件“/home/ubuntu/anaconda3/lib/python3.6/site packages/pandas/io/sql.py”,第1320行,在to_sql中
table.insert(chunksize,method=method)
文件“/home/ubuntu/anaconda3/lib/python3.6/site packages/pandas/io/sql.py”,插入第734行
键,数据列表=self.insert\u data()
文件“/home/ubuntu/anaconda3/lib/python3.6/site packages/pandas/io/sql.py”,第710行,插入_数据
d=np.array(b.get_values(),dtype=object)
记忆者```

您需要在
df中添加chunksize参数。to_sql(....,chunksize=10000)
是否有原因不能使用
psycopg2
库中的
copy_to
,该库接收一个文件对象,而不是将整个数据集保存在内存中?该表是否已编制索引,或者是否有外键,或者它有插入触发器吗?这将大大降低插入速度。“超过我的EC2实例的CPU能力”,这仅仅意味着它运行得更慢。这就是问题所在,还是除了速度慢之外,您还有其他问题?@datanoveler我尝试添加一个chunksize参数,但由于内存错误,脚本仍然失败。我将把错误消息添加到我的原始帖子中。您需要在
df中添加chunksize参数。to_sql(....,chunksize=10000)
是否有理由不能从
psycopg2
库中使用
copy_to
,该库接收一个文件对象,而不是将整个数据集保存在内存中?该表是否已编制索引,或者它有外键,或者它有插入触发器?这将大大降低插入速度。“超过我的EC2实例的CPU能力”,这仅仅意味着它运行得更慢。这就是问题所在,还是除了速度慢之外,您还有其他问题?@datanoveler我尝试添加一个chunksize参数,但由于内存错误,脚本仍然失败。我会将错误消息添加到我的原始帖子中。